文章目录
C++内存相关
本篇介绍了 C++ 内存相关的知识。
C++内存分区
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
- 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
- 堆:就是那些由
new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 - 全局/静态存储区:全局变量和静态变量被分配到同一块内存中。在以前的C语言中,全局变量又分为初始化的和未初始化的。在C++里面没有这个区分了,他们共同占用同一块内存区。
- 常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
- 代码段:代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
根据c/c++对象生命周期不同,c/c++的内存模型有三种不同的内存区域,即
-
自由存储区,动态区、静态区。
-
自由存储区:局部非静态变量的存储区域,即平常所说的栈。
-
动态区: 用operator new ,malloc分配的内存,即平常所说的堆。
-
静态区:全局变量 静态变量 字符串常量存在位置。
下图为 C++ 内存模型,来自C++ Essentials。

- .text 部分是编译后程序的主体,也就是程序的机器指令。
- .data 和 .bss 保存了程序的全局变量,.data保存有初始化的全局变量,.bss保存只有声明没有初始化的全局变量。
- heap(堆)中保存程序中动态分配的内存,比如 C 的
malloc申请的内存,或者C++中new申请的内存。堆向高地址方向增长。 - stack(栈)用来进行函数调用,保存函数参数,临时变量,返回地址等。
- 共享内存的位置在堆和栈之间。
更详细的内存段解释见C与C++内存管理详解。
下面的文章介绍了Linux虚拟地址空间布局。
C++对象的成员函数存放在内存哪里
类成员函数和非成员函数代码存放在代码段。如果类有虚函数,则该类就会存在虚函数表。虚函数表在Linux/Unix 中存放在可执行文件的只读数据段中(rodata),即前面起到的代码段,而微软的编译器将虚函数表存放在常量段。
堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



