携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
内存对齐
内存对齐的目的
假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5,6,7地址),最后留下的两块数据合并放入寄存器.这需要做很多工作。 现在有了内存对齐的,int类型数据只能存放在按照对齐规则的内存中,比如说0地址开始的内存。那么现在该处理器在取数据时一次性就能将数据读出来了,而且不需要做额外的操作,提高了效率。
有效对齐值: 是给定值#pragma pack(n) 和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位
- 结构体第一个成员变量的偏移量为0;
- 之后每个成员相对于结构体的首地址的 偏移量就是该成员大小与有效对齐值中较小的那个的整数倍,如有需要,编译器会在成员之间加上填充字节
- 结构体的总大小是有效对齐值的整数倍
- 结构体嵌套时不能整体看,要看最大的数据类型。
struct A{
int num1;
int num2;
double num3;
};
4 + 4 + 8 = 16
struct B{
int num1;
double num3;
int num2;
};
(4 + 4) + 8 + (4 + 4) = 24
内存管理
内存分配方式
- 栈
- 堆:是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当程序运行时调用malloc()时就会从中分配,调用free可把内存交换
- 自由存储区:自由存储区是一种抽象概念,使用new/delete申请和释放的的区域都被称为自由存储区。所有的C++编译器默认用堆来实现自由存储区
- 全局/静态存储区:全局变量和静态变量
- 常量存储区: 存放常量
内存泄漏
申请一段内存空间后使用完没有释放掉
- new 申请资源后没有delete
- 子类继承父类,父类不是虚析构
- windows句柄资源使用后没有释放