字节对齐的问题
對于IA32指令,Linux沿用的對齊策略是:2字節數據類型的地址必須是2的倍數,而較大的數據類型(int, int*, float和double)的地址必須是4的倍數。
Microsoft Windows對齊的要求更為嚴格--------任何K字節基本對象的地址都必須是K的倍數,K= 2, 4或者8。
事實上,在擴展到X86-64指令之后,就都是后一種對齊方式了。
這里有一點要指出的是,K字節基本對象,也就是說我們只考慮基本數據類型。
考慮如下幾個結構體:
struct P1{int i; char c; long j; char d;};
i的偏移量為0,要求的對齊為4
c的偏移量為4,要求的對齊為1
j的偏移為8,要求的對齊為8。(不是5,因為那樣不滿足對齊策略)
d的偏移為16,要求的對齊為1。
整個結構體占24字節,可以分析下,本來17字節似乎可以,但是考慮各個基本數據的對齊要求,整個結構體占用的字節數必須是8的倍數。而且
整個結構體的對齊要求為8。(只考慮基本數據類型,所以只要按8對齊就能滿足各項的對齊要求)。
?
第二個結構體:
struct p2{short w[3]; char *c[3];}(64位程序,所以指針為8字節)
w的偏移為0,要求的對齊為2。(再次強調,只考慮基本類型)
c的偏移為8,要求的對齊為8。
所以整個結構體占用的字節為32,要求的對齊為8。
?
第三個結構體:
struct p3{struct P1 a[2]; struct P2 *p;};
a的偏移為0, 要求的對齊為8。
p的偏移為48,要求的對齊為8。
所以整個結構體占用的字節為56,要求的對齊為8。
轉載于:https://www.cnblogs.com/hustxujinkang/p/3970765.html
總結
- 上一篇: tomcat 启动时 Initializ
- 下一篇: 《APUE》中的函数整理