C++内存分区
C++存在如下的内存分区
1)栈区(stack):由编译器自动分配释放 ,存放函数的 参数值,局部变量的值等。其操作方式类似于数据结 构中的栈。
2)堆区(heap):一般由程序员分配释放,若程序员不 释放,程序结束时可能由OS回收。注意它与数据结构 中的堆是两回事,分配方式倒是类似于链表。
3)全局/静态区(static):全局变量和静态变量的存储是 放在一块的,在程序编译时分配
4)文字常量区:存放常量字符串
5)程序代码区:存放函数体(类的成员函数、全局函数) 的二进制代码
C语言中,内存分配有三种:
- 静态区域分配:由编译器自动分配与释放,内存在编译的时候已经分配好,这块内存在整个程序的运行期间都存在直到程序结束时才被释放,如全局变量与static变量。
- 栈分配:由编译器在程序运行时从栈上分配,函数栈退出时自动释放。栈分配的运算在处理器的指令集中,所以它的运行效率很高,但能分配的内容是有限的。
- 堆分配:有程序员主动调用内存分配函数来申请内存,且使用完毕后由程序员自己释放,其使用非常灵活,但其分配方式是通过调用函数来实现,效率没栈高。malloc,alloc等
程序在内存中的分布
程序内存分区
中文版
内存分区
内核空间
-
栈
1、stack存放函数的临时变量、局部变量、函数参数和返回值
2、由编译器自动分配和释放。 -
动态链接库(共享映射区)
调用的库文件,位于堆和栈之间
-
堆
heap用来动态分配内存,由程序员控制,交由程序自身决定开辟和释放。
-
全局数据区
.bss
bss
段用来存放没有被初始化和已经被初始化为0的全局变量.data
data
段用来存放已经被初始化为非0的全局变量 -
常量区
.rodata
rodata
段用来存放常量数据、被编译器自动存放来的字符串和加const
关键字的常量数据。 -
代码区
.text
text
段用来存放代码和部分整数常量,该段是可执行的。
堆与栈
栈是一种的“先进后出”的存储结构。
堆是一种完全二叉树。节点从左到右填满,最后一层的树叶都在最左边。(即如果一个节点没有左边儿子,那么它一定没有右边儿子),每个节点的值都小于(或者大于)其子节点的值(大顶堆、小顶堆)。它的特点是可以使用一维数组来表示。堆的操作也可通过数据元素交换的形式解决,非常适合内存空间线性的特点。
参考地址