C++内存管理与程序内存分区

C++内存分区

C++存在如下的内存分区

1)栈区(stack):由编译器自动分配释放 ,存放函数的 参数值,局部变量的值等。其操作方式类似于数据结 构中的栈。

2)堆区(heap):一般由程序员分配释放,若程序员不 释放,程序结束时可能由OS回收。注意它与数据结构 中的堆是两回事,分配方式倒是类似于链表。

3)全局/静态区(static):全局变量和静态变量的存储是 放在一块的,在程序编译时分配

4)文字常量区:存放常量字符串

5)程序代码区:存放函数体(类的成员函数、全局函数) 的二进制代码

C语言中,内存分配有三种:

  1. 静态区域分配:由编译器自动分配与释放,内存在编译的时候已经分配好,这块内存在整个程序的运行期间都存在直到程序结束时才被释放,如全局变量与static变量。
  2. 栈分配:由编译器在程序运行时从栈上分配,函数栈退出时自动释放。栈分配的运算在处理器的指令集中,所以它的运行效率很高,但能分配的内容是有限的。
  3. 堆分配:有程序员主动调用内存分配函数来申请内存,且使用完毕后由程序员自己释放,其使用非常灵活,但其分配方式是通过调用函数来实现,效率没栈高。malloc,alloc等

程序在内存中的分布

程序内存分区

中文版

内存分区
  1. 内核空间

  2. 1、stack存放函数的临时变量、局部变量、函数参数和返回值
    2、由编译器自动分配和释放。

  3. 动态链接库(共享映射区)

    调用的库文件,位于堆和栈之间

  4. heap用来动态分配内存,由程序员控制,交由程序自身决定开辟和释放。

  5. 全局数据区

    .bss

    bss段用来存放没有被初始化和已经被初始化为0的全局变量

    .data

    data段用来存放已经被初始化为非0的全局变量

  6. 常量区

    .rodata

    rodata段用来存放常量数据、被编译器自动存放来的字符串和加const关键字的常量数据。

  7. 代码区

    .text

    text段用来存放代码和部分整数常量,该段是可执行的。

堆与栈

栈是一种的“先进后出”的存储结构。

堆是一种完全二叉树。节点从左到右填满,最后一层的树叶都在最左边。(即如果一个节点没有左边儿子,那么它一定没有右边儿子),每个节点的值都小于(或者大于)其子节点的值(大顶堆、小顶堆)。它的特点是可以使用一维数组来表示。堆的操作也可通过数据元素交换的形式解决,非常适合内存空间线性的特点。


参考地址

  1. 程序在内存中的分布

你可能感兴趣的:(C++内存管理与程序内存分区)