详解4字节对齐

什么是4字节对齐?4字节对齐有什么好处,有什么坏处?分析一波。
首先先定义一个结构体。

typedef struct AA {  
    char a;  
    int b;
    short c;
} AA;
AA aa;

32位处理器,如果没有采用4字节对齐,首先结构体变量aa存放在内存中的起始地址为0x00,那么其成员变量a的起始地址为0x00,成员变量b的起始地址为0x01,结构体变量aa一共占用了5个字节。当CPU要对成员变量a进行访问时,只需要一个读周期即可。而如若要对成员变量b进行访问,首先CPU用了1个读周期从0x00-0x03地址读取4个字节,然后将0x01-0x03地址的3个字节暂存,接着又花费了1个读周期读取了从0x04-0x07地址的4个字节数据,将0x04这个地址取得的字节与上一个周期暂存的3个字节进行拼接从而读取到成员变量b的值。为读取这个成员变量b,CPU花费2个周期。
如果数据成员b的起始地址被放在了0x04处,那么读取其所花费的周期就变成了1,4字节对齐效率提高了,但同时也浪费了0x01-0x03地址上的3个字节的空间。
有3个重要的概念:自身对齐值,指定对齐值和有效对齐值。
1. 自身对齐值:即数据类型的自身的对齐值。
对于32位处理器,char型的数据,其自身对齐值为1字节;short型的数据,其自身对齐值为2字节;int类型,其自身对齐值为4字节;struct和class类型的数据其自身对齐值为其成员变量中自身对齐值最大的那个值。
2. 指定对齐值:指定的对齐值,比如指定4字节对齐。
3. 有效对齐值:上述两个对齐值中最小的那个。
上面的例子,sizeof(aa) = 1(char) + 3个空闲空间 + 4(int) + 2(short) + 2个空闲空间。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,结构体和类都是由多个成员变量组成的。为了在内存中高效地存储这些成员变量,编译器会对结构体和类进行内存字节对齐。 内存字节对齐是指将结构体或类中的成员变量按照一定的规则排列,使得每个成员变量的内存地址都是其长度的整数倍。这样一来,访问这些成员变量时就可以减少内存访问次数,提高访问效率。 内存字节对齐的规则如下: 1. 结构体或类的起始地址必须是其最宽基本类型成员的整数倍。 2. 结构体或类的每个成员变量相对于起始地址的偏移量必须是其类型大小的整数倍。 3. 结构体或类的总大小必须是其最宽基本类型成员大小的整数倍。 例如,一个结构体中有两个成员变量,一个是int类型,一个是char类型。如果按照默认的字节对齐规则排列,结构体的内存布局如下: ``` struct MyStruct { int a; char b; }; // 内存布局 // +---+---+ // | a | b | // +---+---+ ``` 这里,int类型占用4个字节,char类型占用1个字节。因此,编译器会按照4字节对齐的方式排列结构体。由于int类型是最宽的基本类型,所以结构体的起始地址必须是4的倍数,而char类型则放在了4字节边界上。 需要注意的是,内存字节对齐规则可能会因为编译器的不同而产生变化。有些编译器允许开发者通过预处理指令来指定结构体的对齐方式,例如: ``` struct MyStruct { int a; char b; } __attribute__((aligned(8)))); ``` 这里,`__attribute__((aligned(8)))`表示MyStruct结构体需要以8字节对齐的方式排列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值