struct 字节对齐

本文介绍了结构体字节对齐的概念,强调了内存对齐对于CPU读取效率的影响。对齐规则包括结构体首地址的对齐以及成员相对首地址的偏移。在编程中,字节对齐可以影响空间存储和跨平台通信。文章讨论了两种处理字节对齐的方法:使用字节对齐指令和手动填充。通过示例比较了不同排列结构体的存储需求,突显了字节对齐在空间和效率上的权衡。
摘要由CSDN通过智能技术生成

struct 字节对齐

一、概念
  1. 对齐:对齐与数据在内存中的位置相关。如果一个变量的内存地址正好位于它长度的整数倍,被称作自然对齐。

如在32位cpu下,假设一个int变量的地址是 0x00000004,它就是自然对齐的

  1. 为什么需要字节对齐
    内存基本单位是字节,cpu并非逐字节读取内存的,而是以(2,4,8……)的字节块来读写内存。
    如果上面的int变量的地址是0x00000002,cpu就需要访问两次内存了。第一次取0x00000002-0x00000003,第二次取0x00000004-0x00000005.
  2. 对齐规则
  • 结构体变量的首地址能够被其对齐字节数的大小所整除
  • 结构体每个成员相对结构体首地址的偏移都是成员大小的整数倍,如不满足,对前一个成员填充字节以满足
  • 结构体的总大小为结构体对最大成员大小的整数倍,如不满足,最后填充字节以满足
  1. 编程考量
    1. 空间存储(同样内容的结构体,B则只需要12个字节对齐)
      struct A {
         int a;
         char b;
         int c;
         short d;
      }
      
      struct B {
         int a; 
         char b;
         short d;
         int c;
      }
      
    2. 跨平台通信
      不同的平台对齐方式可能不同.一般有两种处理方法
      • 1字节对齐,指令#pragma pack(n)(n为字节对齐数)来使得结构间一字节对齐。任何平台都是最小字节数,节省空间但同时降低了效率。

      • 自己对结构进行字节填充(不建议)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值