【C++】内存对齐笔记
1 内存对齐
内存对齐的主要目的还是用空间换时间,提高处理器对内存的访问效率。
处理器通过地址总线确定要访问的内存时,访问内容的起始地址应该是4的倍数(因为64位的操作系统要兼容32位的操作系统),至于每次要取多少字节可以通过编译器自行设定。比如64位的操作系统,有“每一次取8字节的能力”,但是每次有效存取的字节数可以小于等于8字节。
数据对齐的字节数,和结构体中的占用空间最大的类型一致,如结构体Student1的内存对齐位和int类型一致为4字节,(bool占用1字节,剩下三字节的给三个char)4字节,(剩余的18个char占用4+4+4+4+2,但是2是单独占用4个字节)5*4字节,int再占用4个字节。4*7=28(需要注意的是,char是一种基础类型,char数组的每个元素都可以单独存储,因此可以直接跟在bool对象的后边。)
typedef stuct Student1 //28
{
bool accept;
char name[21];
int score;
};
对于Student2,最大的类型位int(对象占用4字节),因此struct要按照4字节进行对齐。bool单独占用4字节,int正好占用4字节,char占用46=24字节(45+1,但是最后一个1单独占4个字节)。4*8=32.
typedef stuct Student2 //32
{
bool accept;
int score;
char name[21];
};
对于Student3,最大的类型为double(对象占用8字节),因此struct要按照8字节进行对齐。bool占用1字节,剩下的7字节由name填充,剩余的char占用8*2(8+6,6个char单独占用1个字节),double单独占用一个字节。因此总共32字节。
typedef stuct Student3 //32
{
bool accept;
char name[21];
double score;
};
总结一下:
- 32位系统访问内存时,访问空间的起始地址为4的倍数,每次读取的字节数可以小于等于4字节。64位系统兼容32位系统,因此访问空间的起始地址也位4的倍数,每次读取的字节数可以小于等于8字节。
- struct在内存对齐时的对象占用空间大小的计算:
- 看struct内最大的类型占用空间大小N。如Student3是double的8字节,Student2是int的4字节,char数组的类型仍然是char。
- 按照N个字节为一块来给struct对象分配空间。如Student3中的char数组可以紧接着bool存储。但是double要另外占用一块。就是说,基础类型定义的变量所占的空间是不能分开的,需要在一个块内的。
- 计算总共占用了多少块。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!