内存对齐

打印 上一主题 下一主题

主题 855|帖子 855|积分 2565

1.内存对齐是什么?

对结构体和类来说,让变量不是紧挨着存放,而是通过变量字节倍数的形式存放
2.为什么会有内存对齐?


  • 增加cpu的访问数据的速度

    • 对于cpu来说,数据从内存中读到缓存中去,是通过偏移量(offset)进行读取,也就是常说的通过块来读取,而不是按照字节读取。
    • 读取非内存对齐的数据,会出现一次必须读取offset和offset+1两块数据这种情况,这需要为芯片增加额外的加法器( 为了得到offset+1 )。为了上述这种可能,而增加额外的设备,并且每一次的增加访问时间,显然是不明智的
    • 还有一点就是读了两次,读到缓存的位置上也需要两次,同样降低效率

  • 方便于不同机器、不同平台进行数据的准确读取
3.内存对齐规则


  • 规则1:需要按照min(pack,sizeof(变量本身))的倍数进行选择开始位置
  • 规则2:整体按照min(pack,sizeof(字节数最大的变量))的倍数进行计算
  • 规则3:数组则按照本身是哪种类型变量进行计算,同样遵循规则1
  • 规则4:结构体中的结构体X,X内部遵循规则1计算大小,并且选择位置也遵循规则1
  • 注意:

    • 规则1和2,为主要原则,3和4作为拓展
    • sizeof得到所占字节数,pack为对齐模数
    • 查看对齐模数#pragma pack(show),编译时会显示


4.案例

运行环境:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.3.4
对齐模数:#pragma pack(show) == 16  

  • 案例1
  1. pack == 16
  2. struct A{
  3.         char a;        //0-3
  4.         int b;        //4-7
  5.         double c;//8-15       
  6. };  //        16/8 可除
  7. 规则1:需要按照min(pack,sizeof(变量本身))的倍数进行选择开始位置
  8. 规则2:整体按照min(pack,sizeof(字节数最大的变量))的倍数进行计算
复制代码
  1. pack == 2
  2. struct B{
  3.         char a;        //0-2
  4.         int b;        //2-5
  5.         double c;//6-13
  6. };  //        14/2 可除
  7. 规则1:需要按照min(pack,sizeof(变量本身))的倍数进行选择开始位置
  8. 规则2:整体按照min(pack,sizeof(字节数最大的变量))的倍数进行计算
复制代码

  • 案例3
  1. pack == 16
  2. struct C{
  3.         char a;        //0-1
  4.     short b[3];//2-7 --->the place
  5.         int c;        //8-15
  6.         double d;//16-23       
  7. };  //        24/8 可除
  8. 规则3:数组则按照本身是哪种类型变量进行计算,同样遵循规则
复制代码

  • 案例4
  1. pack == 16
  2. struct D{
  3.         char a;        //0-7
  4.     struct C b;//8-31
  5.         int c;        //32-39
  6.         double d;//40-47
  7. };  //        48/8 可除
  8. 规则4:结构体中的结构体X,X内部遵循规则1计算大小,并且选择位置也遵循规则1
复制代码
  1. pack == 2
  2. struct D{
  3.         char a;        //0-1
  4.     struct B b;//2-15
  5.         int c;        //16-19
  6.         double d;//20-7
  7. };  //        28/2 可除
  8. 规则4:结构体中的结构体X,X内部遵循规则1计算大小,并且选择位置也遵循规则1
复制代码
5.其他的注意


  • 空类和空结构体的sizeof大小为1
  • 该环境下指针的大小为8个字节
6.类与内存对齐

待补充链接
参考

参考资料:浅谈CPU内存访问要求对齐的原因 – 仰望苍天思寰宇 (yangwang.hk)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表