自然对齐规则

基本类型的长度计算:

sizeof(char)的长度为:1
sizeof(short)的长度为:2
sizeof(int)的长度为:4
sizeof(long)的长度为:4(Win X86和X64都为4,Linux X86为4,X64为8)
sizeof(float)的长度为:4
sizeof(double)的长度为:8
sizeof(bool)的长度为:1(C++里)
sizeof(BOOL)的长度为:4(windows平台)
sizeof(p)的长度:x86为4,x64为8,其中p为指针类型变量,如char *p,也就是说,在X86平台,指针的长度是4,在X64平台,指针的长度是8。 

 

结构体长度的计算:

自然对齐应该遵守如下两条规则:
1)数据成员对齐规则:
在默认情况下,各成员变量存放的起始地址相对于结构的起始地址的偏移量:sizeof(类型)或其倍数
2)整体对齐规则:
结构的总大小也有个约束条件:最大sizeof(类型)的整数倍

 

栈上对齐方式:

与结构体的自然对齐不同。

1.在X86平台,栈上对齐方式是整数相关类型按照4字节对齐,浮点数按照8字节对齐;

2.在X64平台,栈上浮点数按照16字节对齐。
 

内存对齐的主要作用是:

1、  平台原因(移植原因):不是全部的硬件平台都能訪问随意地址上的随意数据的;某些硬件平台仅仅能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

 

2、  性能原因:经过内存对齐后,CPU的内存訪问速度大大提升。

详细原因稍后解释。

 

 

图一:

这是普通程序猿心目中的内存印象。由一个个的字节组成。而CPU并非这么看待的。

 

图二:

CPU把内存当成是一块一块的,块的大小能够是2,4。8。16字节大小。因此CPU在读取内存时是一块一块进行读取的。块大小成为memory access granularity(粒度) 本人把它翻译为“内存读取粒度” 。

 

如果CPU要读取一个int型4字节大小的数据到寄存器中,分两种情况讨论:

1、数据从0字节開始

2、数据从1字节開始

 

再次如果内存读取粒度为4。

 

图三:

当该数据是从0字节開始时,非常CPU仅仅需读取内存一次就可以把这4字节的数据全然读取到寄存器中。

 

    当该数据是从1字节開始时,问题变的有些复杂。此时该int型数据不是位于内存读取边界上。这就是一类内存未对齐的数据。

 

图四:

 

此时CPU先訪问一次内存。读取0—3字节的数据进寄存器。并再次读取4—5字节的数据进寄存器,接着把0字节和5,6,7字节的数据剔除。最后合并1,2,3。4字节的数据进寄存器。对一个内存未对齐的数据进行了这么多额外的操作。大大减少了CPU性能。

 

    这还属于乐观情况了。上文提到内存对齐的作用之中的一个为平台的移植原因,由于以上操作仅仅有有部分CPU肯干,其它一部分CPU遇到未对齐边界就直接罢工了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值