字节对齐总结

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无穷大

另外二种种说法:

image

image

4.需要注意的是,sizeof函数取的是占用的栈空间,因此static 成员不会计算在内。

主要参考:1.字节对齐(强制对齐以及自然对齐)  2.对齐实例(包括union)

PS:这个总结只是为自己总结的,所以我只图自己方便了,所以可能讲得不是很详尽,当然,如果大家看到了有些帮助那做好不过了,如果有些讲得不对的地方,请指出来。

posted @ 2013-09-08 18:31  曾见绝美的阳光  阅读(350)  评论(0编辑  收藏  举报