c++进程内存空间分布

  • Post author:
  • Post category:其他



c++进程内存空间分布(注意各部分的内存地址谁高谁低,注意栈从高到低分配,堆从低到高分配)



内存分布分为5个部分,从高地址到低地址一次为 栈区(stack),堆区(heap),未初始化数据段(uninitialized data),初始化数据段(initialize data),代码段(text)。

1.文本段也叫代码段,是对象文件或内存中程序的一部分,其中包含可执行指令。文本段在堆栈的下面,是防止堆栈溢出覆盖它。,通常代码段是共享的,对于经常执行的程序,只有一个副本需要存储在内存中,代码段是只读的,以防止程序以外修改指令。

2.初始化的数据段,通常称为数据段,是程序的虚拟地址空间的一部分,它包含有程序员初始化的全局变量和静态变量,可以进一步划分为只读区域和读写区域。

例如,C中的char=“hello world”的全局字符串,以及main(例如全局)之外的int debug=1这样的C语句,将被存储在初始的读写区域中。而像const char字符串=“hello world”这样的全局C语句常量字符串文字“hello world”被存储在初始化的只读区域中,并在初始化的读写区域中存储字符指针变量字符串。

3.为初始化的数据段,通常称为bss段,这个段的数据在程序开始之前有内核初始化为0,包含所有初始化为0和没有显示初始化的全局变量和静态变量,

4.堆  堆是动态内存分配通常发生的部分。内存分配由低到高,分配方式类似于数据结构的链表。堆区域从BSS段的末尾开始,并从那里逐渐增加到更大的地址。堆是由程序员自己分配的。堆区域由所有共享库和进程中动态加载的模块共享。(malloc和new从堆区分配内存)

5.栈  存放自动变量,以及每次调用函数时保存的信息。每当调用一个函数时,返回到的地址和关于调用者环境的某些信息的地址,比如一些机器寄存器,就会被保存在栈中。然后,新调用的函数在栈上分配空间,用于自动和临时变量。(直接定义数组是从栈中分配)



版权声明:本文为xiaozuo2017原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。