C_3:c语言的内存

可执行文件

编译源代码后的目标文件( *.o 文件 )
可执行文件( windows=.exe; linux=.ELF)

代码段+数据段+未初始化数据段

  • 代码段(text): 存放CPU执行的指令

    1. 代码段通常可以共享
    2. 规划了局部变量
    3. 代码段指令包括:操作码和操作对象
    4. 若操作对象是立即数(数值),则包括在代码段
    5. 若操作对象是,局部数据,则在运行时在栈区分配空间,然后引用数据地址
    6. 若是BBS和数据段,则在代码段中引用其地址
  • 数据段(data):全局初始化数据区和静态数据区

    1. 全局变量,静态变量(初始化的全局静态变量和局部静态变量)
    2. 数据常量(字符串常量)
    3. static a=100; 若初始化在任何函数体外,则是全局静态变量
    4. static a=100; 若初始化在某函数体内,则是局部静态变量
    5. 若在函数前加static,则该函数只可以在当前文件被调用

      • 未初始化数据区(bbs):存入全局未初始化的全局变量和未初始化的静态变量
    6. bbs区被内核初始化为0或者NULL

内存布局

Linux的进程内存结构

加载到内存
栈区(向下增加)
堆去(向上增加)
bbs段
数据段
代码段

* 栈:编译器自动分配释放,存放函数的参数值,返回值,局部变量;运行中实时的加载和释放;由esp寄存器定位
* 堆:动态内存分布,由程序员加载和释放

函数存储类型

类型 作用域 生存域 存储位置
auto 一对{}内 当前函数 栈区
extern函数 整个程序 整个程序运行期 代码段
extern变量 整个程序 整个程序运行期 初始化在data段,未初始化在bbs段
static函数 当前文件 整个程序运行期 代码段
static全局变量 当前程序 整个程序运行期 初始化在data段,未初始化在bbs段
static局部变量 一对{}内 整个程序运行期 初始化在data段,未初始化在bbs段
字符串常量 当前文件 整个程序运行期 数据段

堆得管理算法

(malloc+free)

空闲链表法

  • 空闲链表=将堆中的空闲块按照链表的方式连接起来,当用户请求一块空间时,可以遍历整个列表,直到找到合适大小的块,拆分给它;释放后合并到空闲链表
  • 弊端:一旦链表破坏后无法使用

位图

  • 将堆划分为大量的块(block),分配整数块给所需
  • 弊端:碎片

对象池

栈和堆得区别

  1. 管理方式
  2. 空间大小
  3. 碎片
  4. 增长方向
  5. 分配方式
  6. 效率:操作系统提供栈,c库算法提供堆

你可能感兴趣的:(C_3:c语言的内存)