C++基础问题

1. static变量,包括内置数据类型和自定义对象是在何时进行内存分配和初始化的?

  全局变量,文件域静态变量,类的静态成员变量在mian函数执行之前的静态初始化过程中分配内存并进行初始化。

  局部静态变量,在第一次使用时分配内存并进行初始化。??

  以上规则适用于内置数据类型和自定义对象类型。

2. static变量的初始化是否是线程安全的?

  非局部静态变量在main函数执行前完成了内存分配和初始化,一般认为是线程安全的。

  局部静态变量在编译时,编译器在初始化语句前设置一个局部静态变量来判断是否已经完成初始化,运行时每次进行判断,如果此变量为true,将不再执行初始化过程,由于对象的初始化过程不是原子操作,有可能出现局部静态对象未完成初始化,却被使用的情况,因此它不是线程安全的。

  类似static singletan& getInstance(){static singletan s_instance; return s_instance;}不是线程安全的,有可能返回未完成初始化的对象。

  C++11标准中要求保证局部静态变量的初始化是线程安全的,以来编译器的实现。

3. 各种变量的内存分配时机和初始化时机?

  相关的存储区有全局静态区,常量存储区,堆,栈。

  常量存储区,在编译期确定存储大小的常量,只读,相同的字符串常量会被编译器优化合并。

  全局静态区,在编译期确定存储大小的全局变量,静态变量。

  栈,在编译期确定存储大小,函数作用域内的变量,局部变量,函数参数,自动分配和销毁。栈的大小在编译期确定,可通过编译器配置,一般在几M。数据结构类似栈,栈顶地址递减。

  堆,在运行期通过new动态分配的内存空间,由开发者负责释放内存,32位机器大小为4G,数据接口类似链表,会产生碎片,分配效率低于栈,地址递增。

4. 

posted on 2018-11-24 10:39  1105 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/tjuliujie/p/10011270.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值