學無止境

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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  阅读(263)  评论(0编辑  收藏  举报