对齐有如下情况:
1. 基本类型变量起始地址要按一定规则对齐.
char 类型,其起始地址要1字节边界上,即其地址能被1整除(即任意地址即可)
short类型,其起始地址要2字节边界上,即其地址能被2整除
int 类型,其起始地址要4字节边界上,即其地址能被4整除
long类型,其起始地址要4字节边界上,即其地址能被4整除
float类型,其起始地址要4字节边界上,即其地址能被4整除
double类型,其起始地址要8字节边界上,即其地址能被8整除
2. 结构实例起始址要在自己最大尺寸成员的对齐地址上
如最大尺寸的成员是short,则要基于2对齐
3. 结构内成员的偏移量也要参照第1条,满足相应倍数
如成员是short,则偏移量也是2的倍数.
这一条实际仍然是第1条规则的扩展,因为结构起始地址按最大倍数来,加上内部相应倍数,这样成员绝对地址仍然满足第1条规定
4. 结构总尺寸也要对齐. 要为最大尺寸的成员的整数倍,
如果不是则要在结构最后补齐成整数倍
实例 1
例2
例3
对于double类型 在window上和linux 有不同的对齐规则
在window上是8字节对齐
在linux上是四字节对齐
取消字节对齐
绝大部分编译器是使用预编译指令pragma取消对齐
#pragma pack (n) 设置对齐宽度为n,它可以是1,2,4,8等等,其中1就表示不进行字节对齐.
# pragma pack (n)是成片生效的,即在这个指令后面所有结构都会按新的对齐值进行对齐
# pragma pack() 将上一次# pragma pack (n)的设置取消.恢复为默认值.
两者是成对使用,在这两者之间所有结构均受到影响 。
通过#pragma pack(n)来完成生效,但是要注意, 字节对齐值采用
n和默认对齐值中较小的一个.换句话说,
扩大对齐值是不生效的.
阅读(2889) | 评论(0) | 转发(0) |