C/C++ 程序内存的分配

C/C++ 程序内存的分配

一个由C/C++编译的程序占用的内存大体分为以下几个部分

  1. 栈区(stack):由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。
  2. 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。
  3. 全局区(静态区)(static):存放全局变量、静态数据、常量。程序结束后由系统释放。
  4. 文字常量区:常量字符串就是存放在这里的。程序结束后由系统释放。
  5. 程序代码区:存放函数体(类成员函数和全局函数)的二进制代码。

这里写图片描述

注意:
1. 堆和栈是相对而生的。
2. 栈地址的申请是向下生长的;而堆地址的申请是向上生长的。
3. C语言中所说的地址不是物理地址,而是虚拟地址。
4. C程序的地址空间在整个运行程序中是一直存在的。

内存分配方式有3种:

  1. 从静态存储区分配
    内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它是在整个C程序地址空间的已初始化或未初始化的全局变量区,并且在这个区域内他会一直存在。例如:全局变量、static变量
  2. 在栈上创建
    在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈上变量具有临时变量的特性。
  3. 从堆上分配
    也称为动态内存分配。
    程序在运行时用 malloc 或 new 申请任意多少的内存。
    程序员自己负责在何时用 free 或 delete 释放内存。
    动态内存的生命周期由程序员决定,使用非常灵活。但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现泄露。
    频繁的分配和释放不同大小的堆空间将会产生堆内存碎块。

猜你喜欢

转载自blog.csdn.net/bit666888/article/details/81807506