C++里的对齐规则

什么是对齐?
在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一个紧凑地排列在空间上的。它们是按照一种特定的方法排列的,有可能在两个成员变量之间插入一个或个byte,以保证每个成员变量的起始位置是都是从某些特定的位置开始的。这就是对齐。单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么样的规则对齐的。

为什么要对齐?
在大多数平台上,系统从某些特定的位置开始读数据非常快,而从其它位置读数据会慢很多。C/C++是一种注重效率的语言,为了使程序速度尽可能地快,选择牺牲很少的空间,用填充byte的方式保证所有数据的存储都从这些特定的位置开始,而达到较高的运行速度。

什么是4字节对齐?
当说到一个结构体n字节对齐,包含2个信息:
(1)结构体的起始地址能被n整除
(2)结构体的总大小能被n整除
当说到一个成员变量是n字节对齐的,说明该变量的起始地址能被n整除。比如某变量的对齐字节数是4,那么它的首地址的16进制形式一定是以0/4/8/C结尾的。
在实际场景中,n可以是1、2、4、8


规则开始啦。

1.在64位系统中,默认的对齐字节是8。在32位系统中,网上查到的资料有说4也有说8,因为用的是64位系统,没有验证过32位的情况。

struct type
{
    int a;
    long b;
};

int main()
{
    type t;
    cout<<"size = "<<sizeof(t)<<endl;
    cout<<"address a = "<<&t.a<<endl;
    cout<<"address b = "<<&t.b<<endl;
    return 0;
}

运行结果:

size = 16
address a = 0x7fffa0b9e9d0
address b = 0x7fffa0b9e9d8

排列方式:
a a a a 0 0 0 0
b b b b b b b b

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值