程序基本内存布局
代码段 – 存放程序的二进制代码
数据段 – 存放常量、全局变量、静态变量
栈区 – 存放局部变量(自动分配和释放)
堆区 – 动态分配的空间(手动分配和释放)
栈区
- CRE:局部变量在栈区的内存布局是不确定的。
(在Debug模式下,连续声明的局部变量在内存栈区不是紧挨的,有一定的间隙。)
(不同的编译器下局部变量的内存分配实现上也可能有一些区别。)
数据段
常量、全局变量、静态变量都存放在程序数据段。
- const/static区别:
- CRE:static无论是在函数体内还是作为类成员都是全局的。(static成员需要类外初始化)
- CRE:const成员在不同对象中的值不一样。但是static成员在不同对象的值是一样的。
字符串内存布局
- CRE:局部声明的字符串和类成员字符串都和static变量一样存储在程序的数据段。
- CRE:字符数组还是存储在栈区。
数组内存布局
CRE:数组即指针。
CRE:结构体或者类中声明定长数组,会计算入类的size(和声明指针不一样)。
结构体内存布局
- CRE:第一个成员字段的地址就是结构体地址。
- CRE:所有成员字段的size之和就是结构体的size。
- CRE:不是完全紧凑的,会自动对齐。
类的内存布局
- 第一个成员字段的地址就是结构体地址。
- Release模式下本类第一个成员地址紧挨着基类最后一个成员。
注意有些对象的size在Debug和Release下不一样,例如vector在Debug下为16字节而在Release下为12字节。
组合的成员对象先调用构造函数、后调用析构函数。
(END)