关于 C++ 的内存布局,网上说法不一,有人将其分为 4 4 4 区,也有人将其分为 5 5 5 区,不同的人分成的 5 5 5 区也不尽相同,造成这种差异的主要原因是C语言和C++语言的发展背景、个人的分类喜好、个人的命名习惯等。
在本文中,笔者将 C++ 内存详细分为 5 5 5 个区域,如下图所示。
-
栈区
:由编译器自动分配和释放,主要存放函数的参数值、局部变量值等。 -
堆区
:由程序员主动分配和释放,可以通过 malloc()/free() 或 new/delete 来分配和释放。 -
全局/静态存储区
:全局变量和(局部)静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域(C语言区分初始化的和未初始化的,C++没有这个区分)。程序结束后由系统释放。 -
常量存储区
:存放我们代码中的常量、字符串常量等,这样做的目的是为了节省空间,避免重复申请内存。程序结束后由系统释放。 -
程序代码区
:存放函数体(包括类的成员函数、全局函数)的二进制代码。
堆和栈的区别:
- 栈:空间是有限的,分配速度快,程序员控制不了。
- 堆:只要不超出实际拥有的物理内存,同时也在操作系统允许能够分配的最大内存大小之内,都可以分配成功。分配速度比栈慢,程序员可以随时用 malloc()/free() 或 new/delete 来分配和释放,非常灵活。
参考文章: