C程序内存分配
对于一个C语言可执行程序,内存主要由以下4部分组成:
- 代码区:存放可执行代码
- 静态存储区:存放全局变量,静态变量,常量字符串
- 栈:局部变量,函数形参
- 连续的内存的区域,向低地址扩展,;
- 栈的最大空间固定,超出则引起栈溢出,stack overflow;
- 变量离开作用域后,先进后出,栈上的内存会自动释放。
- 堆:手动申请和释放,malloc与free
- 不连续的内存区域,向高地址扩展
- 内存泄漏
- 内存碎片
C程序内存分配
常见变量类型内存
char | short | int | long | float | double | 指针 | |
---|---|---|---|---|---|---|---|
32位编译器 | 1 | 2 | 4 | 4 | 4 | 8 | 4 |
64位编译器 | 1 | 2 | 8 | 4 | 4 | 8 | 8 |
struct内存对齐
提高访问效率,造成空间浪费
- 结构体的每一个成员起始地址必须是自身类型大小的整数倍
- 结构体内所有数据成员各自内存对齐后,结构体本身还要进行一次内存对齐,结构体大小必须是结构体占用最大字节数成员的整数倍
struct A{
char a;
int b;
short c;
}; //12字节
struct B{
short c;
char a;
int b;
}; //8字节
内存对齐