【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;
};

总结一下:

  1. 32位系统访问内存时,访问空间的起始地址为4的倍数,每次读取的字节数可以小于等于4字节。64位系统兼容32位系统,因此访问空间的起始地址也位4的倍数,每次读取的字节数可以小于等于8字节。
  2. struct在内存对齐时的对象占用空间大小的计算:
    • 看struct内最大的类型占用空间大小N。如Student3是double的8字节,Student2是int的4字节,char数组的类型仍然是char。
    • 按照N个字节为一块来给struct对象分配空间。如Student3中的char数组可以紧接着bool存储。但是double要另外占用一块。就是说,基础类型定义的变量所占的空间是不能分开的,需要在一个块内的。
    • 计算总共占用了多少块。
posted @   YueLiGo  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示