C++程序内存分布

了解、理解C++内存分布机制,有利于后续很多概念的理解,内存泄漏、程序大小、静态成员等。

C++开发的基础知识。

先来张图:


C++: 内存分布、全局静态初始化区域、堆栈区的区别等教程

分为以下几部分:

  1. 栈区(stack):

由编译器自动分配并释放,一般用于:函数参数传递、函数内部局部变量。操作方式类似于数据结构中的栈,先进后出。

  1. 堆区(heap):

由程序员手动分配,并由程序员手动释放。未释放时会在程序退出时由操作系统释放。

跟数据结构中的堆(先进先出)不同,内部实现有些像链表。

  1. 静态区/全局区:

全局变量和静态变量是放在一起的。

初始化的全局变量和静态变量放在一个区:data segment

未初始化 的放在相邻的另一个区: bss(block started by symbol)。 该区在编译好的目标文件中不被分配内存,只是记录所需要的大小。

为什么要将初始化和未初始化的变量分别存放在两个区:

a. 内存是否被分配的区别

b. 未初始化的放在bss区,在程序启动时可以统一调用memset。

  1. 常量区:

存放常量字符串,程序退出后由OS释放。

  1. 程序代码区:

存放代码的二进制

堆区和栈区的区别:

1. 管理方式不同,堆区手动管理,会照成内存泄漏;栈区编译器管理,自动分配和释放。

2. 空间大小不同:

堆区跟操作系统32/64位有关、跟运行内存大小有关。

栈区大小要小的多,几M,可通过编译器选项进行修改。

3. 是否会产生碎片。

堆区由于频繁的new/delete,会照成碎片。

而栈区遵守先进后出的原则,不会在栈中弹出,内存分布是连续的。

4. 生长方向:

对于堆来讲,生长方向是向上的。

对于栈来讲,生长方向是向下的。

5. 分配效率:

堆:效率低,由C/C++语言层面提供,先通过一定算法寻找可用的连续空间,失败后再进行一些处理。

栈:效率高,计算机在底层会对其进行支持,有固定的指令,由寄存器来完成。

标签: C++, 内存, 静态, 栈区, 初始化, 堆栈, 堆区

相关文章推荐

添加新评论,含*的栏目为必填