C++地址对齐



一、什么是对齐
 在C/C++中,数据结构或类的成员变量,并不是按照它们的大小,一个一个紧凑地排列在空间上的。它们是按照一种
 特定的方法排列的,有可能在两个成员变量之间插入一个或个byte,以保证每个成员变量的起始位置是都是从某些
 特定的位置开始的。这就是对齐。单纯从语言上描述对齐有些枯燥难以理解,下文将配以例子说明C/C++是基于什么
 样的规则对齐的。
二、为什么对齐
 在大多数平台上,系统从某些特定的位置开始读数据非常快,而从其它位置读数据会慢很多。C/C++是一种注重效率
 的语言,为了使程序速度尽可能地快,选择牺牲很少的空间,用填充byte的方式保证所有数据的存储都从这些特定
 的位置开始,而达到较高的运行速度。
 
 什么是4字节对齐?
  当说到一个结构体n字节对齐,包含2个信息:
 (1)结构体的起始地址能被n整除
 (2)结构体的总大小能被n整除
 当说到一个成员变量是n字节对齐的,说明该变量的起始地址能被n整除。比如某变量的对齐字节数是4,那么它的
 首地址的16进制形式一定是以0/4/8/C结尾的。
 
 默认对齐值
 1.在64位系统中,默认的对齐字节是8。在32位系统中,网上查到的资料有说4也有说8,因为用的是64位系统,没
   有验证过32位的情况。
 
 
三、字节对齐
 1.编译器对字节对齐的一些规则
  a. 关于数据类型自身的对齐值,不同类型会按不同的字节来对齐。
  b. 类、结构体的自身对齐字节值。对于结构体类型与类对象的对齐原则:使用成员当中最大的对齐字节来对
    齐。比如在Struct A中,int a的对齐字节为4,比char,short都大,所以A的对齐字节为4
  c. 指定对齐字节值。意思是指使用了宏 #pragma pack(n)来指定的对齐值
  d. 类、结构及成员的有效对齐字节值。有效对齐值=min(类/结构体/成员的自身对齐字节值,指定对齐字节值)
   。有效对齐值决定了数据的存放方 式,sizeof 运算符就是根据有效对齐值来计算成员大小的。简单来说,
   有效对齐其实就是要求数据成员存放的地址值能被有效对齐值整除,即:地址值%有效对齐值=0。
 
2.32位机上类型长度

size of char: 1

size of int: 4

size of long:4

size of float:4

size of long long:8

size of double:8

size of long double:12

size of char * :4

3.64位机上类型长度

size of char:1

size of int:4

size of long :8

size of float :4

size of long long:8

size of double:8

size of long double:16

size of char * :8


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值