C++——数据存储
静态/动态内存分配
一个程序被加载到内存中,这块内存首先就存在两种属性:静态分配内存和动态分配内存。
静态分配内存:是在程序编译和链接时就确定好的内存。
动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。
数据存储
-
Text
也称为代码段(Code),用来存放程序执行代码,同时也可能会包含一些常量(如一些字符串常量等)。该段内存为静态分配,这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。 -
Data
存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。
data又可分为读写(RW)区域和只读(RO)区域。- RO段保存常量所以也被称为.constdata eg const数据
- RW段则是普通非常全局变量,静态变量就在其中
-
Bss
未初始化数据区,通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。
可执行程序在运行时又多出两个区域:栈区和堆区。
栈区和堆区
栈区
由编译器自动释放,存放函数的参数值、局部变量等。每当一个函数被调用时,该函数的返回类型和一些调用的信息被存放到栈中。然后这个被调用的函数再为他的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈就会被使用。栈区是从高地址位向低地址位增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出,用户能从栈中获取的空间较小。
堆区
用于动态分配内存,位于BSS和栈中间的地址区域。由程序员申请分配和释放。堆是从低地址位向高地址位增长,采用链式存储结构。频繁的malloc/free造成内存空间的不连续,产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间。因此堆的效率比栈要低的多。
每个线程都会有自己的栈,但是堆空间是共用的。各区域的分布如下图:
参考资料: