字节对齐总结
1.字节对齐的缘由?
一句话说就是提高存取效率,存取效率与机器相关,比如有的机器总是从偶数字节开始取数据;同时,存取效率也和数据类型相关,比如如果取一个整型数字时,若能够一次取出来肯定是最好,但是若由于机器取数据总是从偶数字节开始这个原因花了两次访问,那么肯定会降低效率了。
2.字符对齐中的一些概念?
- #pragma pack(n):表示显式声明机器的对齐字节为n,我们记这个数字为MA,每个机器都有默认的MA,刚才那句话的意思是改变MA,要恢复系统默认MA,语法是#pragma pack()
- 有效对齐字节:以结构体为例进行分析,对于结构体中每个成员,它本身字节对齐要求至少得满足起始地址是本身大小的整数倍,但是如果MA小于它本身大小,那么要求对齐数为MA,在任何需要对齐的地方,有效对齐字节=min(MA,数据对齐字节)
- 什么时候需要对齐?对于结构体,其每一个成员需要对齐,最后整个结构体的大小也需要对齐
3.对齐的原则(以结构体为例)
- 对于结构体中每一个元素,对齐大小为min(MA,自身大小)
- 结构体的首地址必须与min(MA,结构体中最大体积元素大小)对齐,注意不是min(MA,结构体大小)
- 结构体最终大小需为min(MA,结构体中最大体积大小)对齐
- C编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。即如果不用#pragma pack(n) ,那么相当于n无穷大
另外二种种说法:
4.需要注意的是,sizeof函数取的是占用的栈空间,因此static 成员不会计算在内。
主要参考:1.字节对齐(强制对齐以及自然对齐) 2.对齐实例(包括union)
PS:这个总结只是为自己总结的,所以我只图自己方便了,所以可能讲得不是很详尽,当然,如果大家看到了有些帮助那做好不过了,如果有些讲得不对的地方,请指出来。