c++内存分配以及变量初始化
-
内存分配方式
c++内存中分为5个区,分别是堆、栈、自由存储区、全局\静态存储区以及常量存储区
堆: 操作系统维护的一块特殊内存,用于程序的内存动态分配。C语言使用malloc从堆上分配内存,free释放已分配内存。
栈:执行函数时,函数的局部变量的存储单元是在栈空间创建,函数执行结束这些从存储单元会被自动释放。栈内存分配运算内置于处理器指令集上,效率很高,但内存容量有限。
自由存储区:自由存储区是c++基于new操作符的一个抽象概念,凡是通过new操作符申请的内存都叫自由存储区。一般情况下,编译器在底层通过malloc/free实现new/delete操作,此时可以说自由存储区位于堆空间。
全局\静态存储区:这块内存在程序编译阶段就已经分配好,程序运行期间一直存在。
常量存储区:用于存放const常量的特殊存储区。 -
全局变量、static变量初始化时间
全局变量与静态变量是存放在静态\全局存储区的,根据c++标准,在main函数执行之前,编译器已经为其分配好了内存。
全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;
但是这个说法还是不够精确,到底是编译时期还是运行时呢?
答案是两者都有
从语言层次来讲,初始化分为两个阶段(c++ 11)
静态初始化:
使用常量对变量进行初始化,主要包括zero-initialization 和 const initialization, 编译时期即可完成。
动态初始化: 动态初始化指的是需要经过函数调用才能完成的初始化,比如 int a= foo()或者复杂类型(类)的初始化(需要调用构造函数),这些变量的初始化会在main函数执行前调用相应的代码进行初始化(函数内的局部静态变量除外)
因此C++的对象是在执行相关代码时才会进行初始化,
- 静态局部变量初始化时间
C与C++对于静态局部变量的初始化时间不太一样.
- C中初始化发生在代码执行之前,编译阶段分配好内存之后就会进行初始化,因此C语言中无法使用变量对静态局部变量进行初始化。
- C++中只有在执行相关代码时才对静态局部变量进行初始化,主要是由于C++引入的对象其初始化需要执行构造函数以及析构函数,这些函数通常并非简单的分配内存。也因此C++中可以使用变量对静态局部变量进行初始化。