不同编译单元内定义的non-local static 对象

这里先解释一下名词,static是静态的意思,表示这个变量不由栈分配,而存储在特有的全局变量/静态变量区域中,具有长寿命的特点(从被构造出来,直到程序结束时,才会由系统释放资源);而non-local则是说这个对象是全局的,而不是函数内的静态变量,是说它的作用范围广。本博客中

http://www.cnblogs.com/jerry19880126/archive/2012/12/22/2829394.html

介绍了有关函数作域和生存周期的区别。

这里相关名词感觉这个解释比较合理:
编译单元指的是可以编译为.o文件的代码。
static对象就是全局对象,在namespace作用域的对象;类内,函数内,文件作用域内的static对象。
non-local对象就是不在函数内定义的对象。

比如在文件1中定义了

int a = 1;
而在文件2中又会去使用:

extern int a;
int b = a *3;
可以看到文件1应在文件2之后执行,这样a才能获得初值,否则b得到的将是垃圾值,但事实上C++对于不同文件执行的相对次序并无明确定义,这样b究竟得到的是垃圾值还是3就不能确定。

解决这个问题是方法是不要使变量有全局的作用域,可以在文件1中定义:

1 int& GetA()
2 {
3 static int a = 1;
4 return a;
5 }
而在文件2中调用

int b = GetA();
这样就一定保证a的初始化在先了。

总结一下:

(1) 为内置型对象进行手工初始化,因为C++不保证初始化它们;

(2) 构造函数最好使用成员初始化列表(实际初始化顺序不与列表的排列顺序有关,只取决于类中的声明顺序),而不要在构造函数体内使用赋值操作;

(3) 未避免“跨编译单元的初始化次序”问题,请用local static代替non-local static对象。

转发:https://www.cnblogs.com/jerry19880126/archive/2013/03/09/2951186.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值