C++程序内存分布
了解、理解C++内存分布机制,有利于后续很多概念的理解,内存泄漏、程序大小、静态成员等。
C++开发的基础知识。
先来张图:
分为以下几部分:
1. 栈区(stack):
由编译器自动分配并释放,一般用于:函数参数传递、函数内部局部变量。操作方式类似于数据结构中的栈,先进后出。
2. 堆区(heap):
由程序员手动分配,并由程序员手动释放。未释放时会在程序退出时由操作系统释放。
跟数据结构中的堆(先进先出)不同,内部实现有些像链表。
3. 静态区/全局区:
全局变量和静态变量是放在一起的。
初始化的全局变量和静态变量放在一个区:data segment
未初始化 的放在相邻的另一个区: bss(block started by symbol)。 该区在编译好的目标文件中不被分配内存,只是记录所需要的大小。
为什么要将初始化和未初始化的变量分别存放在两个区:
a. 内存是否被分配的区别
b. 未初始化的放在bss区,在程序启动时可以统一调用memset。
4. 常量区:
存放常量字符串,程序退出后由OS释放。
5. 程序代码区:
存放代码的二进制
堆区和栈区的区别:
1. 管理方式不同,堆区手动管理,会照成内存泄漏;栈区编译器管理,自动分配和释放。
2. 空间大小不同:
堆区跟操作系统32/64位有关、跟运行内存大小有关。
栈区大小要小的多,几M,可通过编译器选项进行修改。
3. 是否会产生碎片。
堆区由于频繁的new/delete,会照成碎片。
而栈区遵守先进后出的原则,不会在栈中弹出,内存分布是连续的。
4. 生长方向:
对于堆来讲,生长方向是向上的。
对于栈来讲,生长方向是向下的。
5. 分配效率:
堆:效率低,由C/C++语言层面提供,先通过一定算法寻找可用的连续空间,失败后再进行一些处理。
栈:效率高,计算机在底层会对其进行支持,有固定的指令,由寄存器来完成。
原文:https://www.cnblogs.com/dylan-liang/p/14407210.html