您的位置:首页 > 编程语言 > C语言/C++

C_3:c语言的内存

2015-12-02 22:22 363 查看

可执行文件

编译源代码后的目标文件( *.o 文件 )

可执行文件( windows=.exe; linux=.ELF)

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

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

代码段通常可以共享

规划了局部变量

代码段指令包括:操作码和操作对象

若操作对象是立即数(数值),则包括在代码段

若操作对象是,局部数据,则在运行时在栈区分配空间,然后引用数据地址

若是BBS和数据段,则在代码段中引用其地址

数据段(data):全局初始化数据区和静态数据区

全局变量,静态变量(初始化的全局静态变量和局部静态变量)

数据常量(字符串常量)

static a=100; 若初始化在任何函数体外,则是全局静态变量

static a=100; 若初始化在某函数体内,则是局部静态变量

若在函数前加static,则该函数只可以在当前文件被调用

未初始化数据区(bbs):存入全局未初始化的全局变量和未初始化的静态变量

bbs区被内核初始化为0或者NULL

内存布局

Linux的进程内存结构

加载到内存
栈区(向下增加)
堆去(向上增加)
bbs段
数据段
代码段
* 栈:编译器自动分配释放,存放函数的参数值,返回值,局部变量;运行中实时的加载和释放;由esp寄存器定位

* 堆:动态内存分布,由程序员加载和释放

函数存储类型

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

堆得管理算法

(malloc+free)

空闲链表法

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

弊端:一旦链表破坏后无法使用

位图

将堆划分为大量的块(block),分配整数块给所需

弊端:碎片

对象池

栈和堆得区别

管理方式

空间大小

碎片

增长方向

分配方式

效率:操作系统提供栈,c库算法提供堆
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: