在x86或ARM處理器上儲存基本C數據類型通常不會從記憶體中的任意byte addresses開始。 相反,除char之外的每個類型都有對齊要求,chars可以從任何byte address開始,但是2-byte shorts必須從偶數address開始,4-byte ints或floats必須從可被4整除的addresses開始,8-byte longs或doubles必須從可被8整除的地址開始。
x86和ARM上的基本C類型是自對齊的。 Pointers,無論是32-bit (4-byte)還是64-bit (8-byte) ,都是自對齊(self-aligned)的。
char c; char pad1[M]; char *p; char pad2[N]; int x;
在這個例子N將會等於0,因為x在p下面的address保證是pointer-aligned。M的值不太可預測。 如果編譯器碰巧將c合併到machine word的最後一個byte,則下一個byte(p)將是第一個byte,並且正確地pointer-aligned。 M將為零。
更有可能的情況是c合併到machine word的第一個byte。 在這種情況下,M將需要padding,以確保p具有pointer對齊 - 在32位元機器上padding為3,在64位元機器上padding為7。
M可以是0到7之間的任何值(32位元為0到3),因為char可以在機器字中的任何byte邊界上開始。
如果你想讓這些變量佔用更少的空間,你可以在原始序列中用c交換x來獲得該效果。
沒有留言:
張貼留言