登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

银河里的星星

落在人间

 
 
 

日志

 
 

c++静态对象的初始化  

2009-04-21 09:59:34|  分类: 程序设计语言 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

静态对象语义

所谓的静态对象,是指从产生一直持续到程序结束的那些对象,在这个过程中不会动态的消亡,所以被称为静态对象。包括global对象,定义于namespace的对象,在class 函数 file里的static对象。其中函数里的是local静态对象,其他都是non-local的,local与non-local的初始化时机不同。对于local的静态对象,初始化发生在函数被调用期间,首次碰到该定义时。而对于non-local的静态变量则在main函数的usercode之前进行初始化。

对于类中的静态变量和全局变量都是non-local静态变量,必要的初始化都是在main里的user code之前完成,作为类的成员而非对象成员,初始化时机与该类对象并无关系。

其中出现在类定义中的静态变量语句只是声明,对于要使用的类的静态成员变量,必须还要在类外进行定义,否则使用时会发生链接错误。声明并不会导致空间的分配,只有定义才会使其被生成。也就是如果你对类的静态成员进行了定义,那么它就肯定会被分配空间并初始化。就像全局变量一样。

静态成员变量初始化

有人可能提出这样的疑问:假如好多类都声明了自己大量的静态变量,但是这些类好多都没用,这样其不是浪费了好多空间,为啥不等到有类被使用的时候在申请空间呢?

首先如果你没有用这个东西,你可以不定义它。另一方面既然你声明了,说明你需要它,但你用根本没用它,那这个变量根本就是不需要的,那就是可以去掉了。另外从库的观点看,作为类的属性,一般应当与类同时被用到 。当然像你说的java的实现方法,也没有问题啊,同样都是很多因素下权衡下来的一个决定吧。

但是如果在c++中如果这样实现,意味着要改变变量定义的语义,而这个改变的影响是巨大的,就像一个全局变量我们定义了,能否不给他分配空间,而是等到第一次使用它时再搞呢?当然也许会问:能否通过编译器优化把这样定义了而没使用的变量优化掉呢?实际上这也是不可能的,因为虽然没有使用这样的变量,但是程序可能依赖与该变量的初始化动作,比如在它的构造函数中建立起执行环境,如果把它优化掉了,程序就是错误的了。

实现方法:

对于non-local静态变量的初始化,编译器实际上是这样实现的。对每个编译文件里需要初始化的静态变量,生成一系列的sti_开头的函数,在里面完成初始化调用语句,然后把这些sti_函数抽取出来,形成一个初始化函数表,然后在__main()函数里调用,然后把这个函数放到main里的开头。

而对于local静态变量,为了实现第一次碰到时初始化,附加了一个全局变量,标志该对象是否被初始化,同时在析构时检查这个变量。这样就保证了第一次碰到时初始化,同时只有在执行了构造函数的时候,才会在程序退出时执行对应的析构函数。

 转载请注明作者:phylips@bmy 出处:http://duanple.blog.163.com/blog/static/70971767200932195934967/

  评论这张
 
阅读(5686)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018