论坛首页 综合技术论坛

《Essential c++中文版》读书笔记--静态局部变量(一)

浏览 17558 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-08  
Arath 写道
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

2.别那么瞧不起使用局部静态变量,有时很有用,比如meyer singleton


没有瞧不起的意思,但是这种写法不是所有人都能够理解清楚的。
程序除了能够正确实现功能的同时也希望能够较为容易的被他人所看懂,使用一些生僻或者歧义的语法或功能(我就简单说为语法偏门)是很大阻碍.
当然不是说不需要了解这些,如果了解了那么至少对自己是一个提高,只是不建议使用.
还有就是这些语法偏门都可以被直观易懂的语法或功能替代的时候,为什么要用呢(特殊场合除外)?



局部静态变量本来就是这样的,老谭的C程序设计上就有而且很多工程中就这样用,这不算是偏门吧。
其他的话倒是同意。
0 请登录后投票
   发表时间:2007-01-09  
Arath 写道
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

2.别那么瞧不起使用局部静态变量,有时很有用,比如meyer singleton


没有瞧不起的意思,但是这种写法不是所有人都能够理解清楚的。
程序除了能够正确实现功能的同时也希望能够较为容易的被他人所看懂,使用一些生僻或者歧义的语法或功能(我就简单说为语法偏门)是很大阻碍.
当然不是说不需要了解这些,如果了解了那么至少对自己是一个提高,只是不建议使用.
还有就是这些语法偏门都可以被直观易懂的语法或功能替代的时候,为什么要用呢(特殊场合除外)?


相对于全局变量,我更加倾向于静态局部变量。后者更安全,而且它也算不上什么生僻少见的用法。
0 请登录后投票
   发表时间:2007-01-16  
跟全局变量好像是一样的,只不过只能函数内访问,确实有时候很有用。
class SystemInfo
{
public:
static int number_of_processors()
{
return _get_systeminfo().dwNumberOfProcessors;
}

/// Returns the page size of the host machine
static int page_size()
{
return _get_systeminfo().dwPageSize;
}

/// Returns the allocation granularity of the host machine
static int allocation_granularity()
{
return _get_systeminfo().dwAllocationGranularity;
}

/// Provides a non-mutable (const) reference to the \c SYSTEM_INFO instance
static const SYSTEM_INFO &get_systeminfo()
{
return _get_systeminfo();
}
private:
static SYSTEM_INFO &_get_systeminfo()
{
static SYSTEM_INFO  s_systeminfo;
static bool nnouse=(::GetSystemInfo(&s_systeminfo), true);
return s_systeminfo;
}
};
0 请登录后投票
   发表时间:2007-01-16  
七猫 写道
跟全局变量好像是一样的,只不过只能函数内访问,确实有时候很有用。
class SystemInfo
{
public:
static int number_of_processors()
{
return _get_systeminfo().dwNumberOfProcessors;
}

/// Returns the page size of the host machine
static int page_size()
{
return _get_systeminfo().dwPageSize;
}

/// Returns the allocation granularity of the host machine
static int allocation_granularity()
{
return _get_systeminfo().dwAllocationGranularity;
}

/// Provides a non-mutable (const) reference to the \c SYSTEM_INFO instance
static const SYSTEM_INFO &get_systeminfo()
{
return _get_systeminfo();
}
private:
static SYSTEM_INFO &_get_systeminfo()
{
static SYSTEM_INFO  s_systeminfo;
static bool nnouse=(::GetSystemInfo(&s_systeminfo), true);
return s_systeminfo;
}
};


和全局变量不太一样。最大的区别是静态局部变量构造的时机是确定的,它在该函数第一次被调用时构造,而全局变量的构造时机则较难确定。这个在需要保证对象之间的构造次序的情况下,非常有用。
0 请登录后投票
   发表时间:2007-01-16  
从理论上来都是在第一次使用前构造好,C++的全局变量的构造次序似乎难以保证。
0 请登录后投票
   发表时间:2007-01-16  
七猫 写道
从理论上来都是在第一次使用前构造好,C++的全局变量的构造次序似乎难以保证。


全局变量理论上只能保证在 main 函数之前构造完毕,同时一个翻译单元内的全局变量按声明次序构造,除此之外没有任何保证,所以万一一个全局变量构造时试图访问另一个全局变量的话,很容易出问题。而局部静态变量则保证在第一次调用时构造,这个确定性强多了。
0 请登录后投票
   发表时间:2007-01-16  
zeze.... 这次有学到很多....
还有一个疑问静态局部变量创建以后是放在什么存储区呢?
0 请登录后投票
   发表时间:2007-01-17  
Elminster 写道
七猫 写道
从理论上来都是在第一次使用前构造好,C++的全局变量的构造次序似乎难以保证。


全局变量理论上只能保证在 main 函数之前构造完毕,同时一个翻译单元内的全局变量按声明次序构造,除此之外没有任何保证,所以万一一个全局变量构造时试图访问另一个全局变量的话,很容易出问题。而局部静态变量则保证在第一次调用时构造,这个确定性强多了。


不知道为什么会提出全局变量构造难以保证,这一点必须是编译器与操作系统协调好的,否则后果不堪设想.
另一个问题,如果全局遇到的那个问题那么局部也逃不掉,所以如果从这方面说两者没有什么区别,区别还在于作用域上,当然采用何种方法还在于人的习惯.
无论是全局的还是局部的,其构造都是由编译器产生额外的代码,然后将这个代码放在正确的入口处,这一点任何C/C++编译器都不会有什么大区别.
0 请登录后投票
   发表时间:2007-01-17  
fullfocus 写道
zeze.... 这次有学到很多....
还有一个疑问静态局部变量创建以后是放在什么存储区呢?


静态局部变量只是限制了其作用域,所以和全局的一样存放在一起.
0 请登录后投票
   发表时间:2007-01-17  
grantren 写道
Arath 写道
runes 写道
1.实话说,我没有看出来,哪里有偏门的地方

2.别那么瞧不起使用局部静态变量,有时很有用,比如meyer singleton


没有瞧不起的意思,但是这种写法不是所有人都能够理解清楚的。
程序除了能够正确实现功能的同时也希望能够较为容易的被他人所看懂,使用一些生僻或者歧义的语法或功能(我就简单说为语法偏门)是很大阻碍.
当然不是说不需要了解这些,如果了解了那么至少对自己是一个提高,只是不建议使用.
还有就是这些语法偏门都可以被直观易懂的语法或功能替代的时候,为什么要用呢(特殊场合除外)?



局部静态变量本来就是这样的,老谭的C程序设计上就有而且很多工程中就这样用,这不算是偏门吧。
其他的话倒是同意。


老谭。。。他被人称作误人子弟的!
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics