C_3:c语言的内存
2015-12-02 22:22
405 查看
可执行文件
编译源代码后的目标文件( *.o 文件 )可执行文件( windows=.exe; linux=.ELF)
代码段+数据段+未初始化数据段
代码段(text): 存放CPU执行的指令
代码段通常可以共享
规划了局部变量
代码段指令包括:操作码和操作对象
若操作对象是立即数(数值),则包括在代码段
若操作对象是,局部数据,则在运行时在栈区分配空间,然后引用数据地址
若是BBS和数据段,则在代码段中引用其地址
数据段(data):全局初始化数据区和静态数据区
全局变量,静态变量(初始化的全局静态变量和局部静态变量)
数据常量(字符串常量)
static a=100; 若初始化在任何函数体外,则是全局静态变量
static a=100; 若初始化在某函数体内,则是局部静态变量
若在函数前加static,则该函数只可以在当前文件被调用
未初始化数据区(bbs):存入全局未初始化的全局变量和未初始化的静态变量
bbs区被内核初始化为0或者NULL
内存布局
Linux的进程内存结构
加载到内存 |
---|
栈区(向下增加) |
堆去(向上增加) |
bbs段 |
数据段 |
代码段 |
* 堆:动态内存分布,由程序员加载和释放
函数存储类型
类型 | 作用域 | 生存域 | 存储位置 |
---|---|---|---|
auto | 一对{}内 | 当前函数 | 栈区 |
extern函数 | 整个程序 | 整个程序运行期 | 代码段 |
extern变量 | 整个程序 | 整个程序运行期 | 初始化在data段,未初始化在bbs段 |
static函数 | 当前文件 | 整个程序运行期 | 代码段 |
static全局变量 | 当前程序 | 整个程序运行期 | 初始化在data段,未初始化在bbs段 |
static局部变量 | 一对{}内 | 整个程序运行期 | 初始化在data段,未初始化在bbs段 |
字符串常量 | 当前文件 | 整个程序运行期 | 数据段 |
堆得管理算法
(malloc+free)空闲链表法
空闲链表=将堆中的空闲块按照链表的方式连接起来,当用户请求一块空间时,可以遍历整个列表,直到找到合适大小的块,拆分给它;释放后合并到空闲链表弊端:一旦链表破坏后无法使用
位图
将堆划分为大量的块(block),分配整数块给所需弊端:碎片
对象池
栈和堆得区别
管理方式空间大小
碎片
增长方向
分配方式
效率:操作系统提供栈,c库算法提供堆
相关文章推荐
- 编写一个程序从键盘输入字符,并按要求输出
- C++继承与友元、继承与类型转换
- 一起talk C栗子吧(第七十回:C语言实例--字符串初始化函数)
- C++类的析构函数不能抛出异常
- 在C++中,关键字explicit的作用
- C++ 标准IO库
- C语言纪要
- 判断数组中是否有重复的数字(C++)
- 【C++】基础知识—对C语言的加强
- JNI调用C++类的方式
- leetcode 283 Move Zeroes C++
- C语言 九九乘法表
- 稀疏矩阵的C++实现
- private, public, protected 访问标号的访问范围之C++篇
- POJ 2828 Buy Tickets 题意&题解&代码(c++)
- c++学习笔记(专注细节,持续更新)
- Protocol Buffer技术详解(C++实例)
- 不用加减乘除做加法(C++)
- 初学链表的一些总结
- 自学c语言的第一天(算是吧)