網頁

2019年2月5日 星期二

Structure Packing

首先要了解的是,現在的處理器為了讓記憶體快速地存取,我們電腦的編譯器在設計基礎的datatypes是有被限制的,接下來我們會討論C語言,當然其他程式語言也是會受到一樣的限制。

在x86或ARM處理器上儲存基本C數據類型通常不會從記憶體中的任意byte addresses開始。 相反,除char之外的每個類型都有對齊要求,chars可以從任何byte address開始,但是2-byte shorts必須從偶數address開始,4-byte intsfloats必須從可被4整除的addresses開始,8-byte longsdoubles必須從可被8整除的地址開始。

x86和ARM上的基本C類型是自對齊的。 Pointers,無論是32-bit (4-byte)還是64-bit (8-byte) ,都是自對齊(self-aligned)的。

自對齊使速度更快,因為它有助於生成單指令提取和輸入資料型態。 另一方面,在沒有對齊約束的情況下,程式碼可能最終必須進行跨越machine-word邊界兩次或更多次存取。Characters是一個特例; 它們在一個machine word內的任何地方可能都會產生很大的padding。 這就是他們沒有首選對齊的原因。以下面例子說明:

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來獲得該效果。


沒有留言:

張貼留言