【c++那些事】程序运行时内存的划分与使用
程序运行时内存的分配可以分为如下几个区域:栈,堆,BBS,数据段(有的又会把BBS和数据段统一称为静态存储区,保存静态变量和全局变量、常量等),代码段
各个区域的说明
1:栈区
特点:栈的增长方向是自顶向下的增长,基地址是高地址,分配地址依次分配到低地址中,栈是先进后出的数据结构类型
使用:(由编译器自动分配和释放)
1:是有用户临时定义的变量的存放区域,不包含static关键字定义的变量
2:函数调用时函数地址以及参数传递也使用栈进行传递,当函数调用完成后 进行弹栈处理恢复之前的函数现场
注意点:
其中32位VS的默认栈大小为1M,可以通过VS手工修改栈的大小
64位linux的默认栈大小位10M,可以通过ulimit-s来修改
2:堆区
特点:堆的增长方向是自底向上的增长,基地址是低地址,分配以此放置到高地址中
堆中的数据是动态分配的内存段,作用域是整个程序运行期间,直至被手工释放。当使用malloc或new进行分配内存时,堆的大小会向高地址增长。
使用:
1:堆中的数据是用户手工申请和释放的内存空间。
2:需要有用户自行管理堆中数据的释放,否则会引起内存泄漏问题。
注意:
堆的大小总是系统的虚拟内存大小
堆经过不断的申请释放后会产生内存碎片,而栈不会
malloc和new的区别:
1:malloc是c语言函数,new是c++的操作符
2:malloc返回的是void*的指针,new返回的是指定类型的指针
3:malloc仅负责申请内存,new申请完内存后会自动调用构造函数
3:BBS区
BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0。
BSS段属于静态内存分配,BSS节不包含任何数据,只是简单的维护开始和结束的地址。
比如:(static) int gInt =0; 初始化为0 或者 (static) int gInt;未初始化
4:数据区
通常是指用来存放程序中已经初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以分为只读数据段和读写数据段。字符串常量等,但一般都是放在只读数据段中.
注意:这里不区分是初始化和未初始化的数据区,因为静态数据区如果未初始化也会被默认自动初始化为0,即BBS区。
5:代码区
存放程序体的二进制代码,只读,存放在低地址处