C++static对象内存分配、初始化、线程安全等问题

关于内存分配:由于static对象都是存储在全局数据段(对应可执行文件中的数据段),这些对象的内存都是在编译时就已经分配好了。

关于初始化:
C与C++表现得不同:由于C没有构造函数,因此初始化其实在编译时候已经完成;
而C++含有构造函数,需要调用对应的二进制代码,因此不可能在编译的时候完成。
对于全局对象、全局static对象、类static成员这些都是在main函数执行前调用构造函数进行初始化;
而对于函数内的static对象,其存储在bss数据段,使用一个bit来表示是否初始化,初始化的时间为第一次调用这个函数(更准确的说,是直到使用这个对象时)时才初始化。

关于线程安全:
全局对象、全局static对象、类static对象都是main函数前就初始化的,不存在线程安全问题,而函数内static对象在C++11以前是不安全的,C++11之后才是线程安全。

再说说bss段和data段
bss段是存储未经初始化的全局变量/static变量,而data段则是存储已初始化的全局变量/static变量,这里的已初始化和未初始化是指程序运行前的时刻,也就是编译后的状态。那么根据以上分析可知,能够在编译期就能进行初始化的变量都是基本类型,所以存储在data段的都是使用字面值初始化了的基本类型,而bss段就是没有初始化的基本类型(即只声明没有赋值)和普通对象。

参考:
https://www.zhihu.com/question/40693991
https://www.cnblogs.com/novice-dxx/p/7094690.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值