
430
|
附錄 A
打包一個結構
packed
屬性用於提示編譯器,應該盡可能以最低限度的空間,把一個資料型別或變數打
包進記憶體,這可能會導致無法符合對齊的需求。如果此屬性指定在
struct
或
union
之
上,則其所有的變數皆會被打包進記憶體。如果只對一個變數指定此屬性,則只有特定
的物件會被打包進記憶體。
如下的定義會把結構中的所有變數打包進最低限度的記憶體空間:
struct __attribute__ ((packed)) foo { ... };
舉例來說,一個結構中包含了一個
char
後面跟著一個
int
,但是你很有可能會發現,對
齊記憶體位址的整數並未緊跟在
char
後面,例如在三個位元組之後。編譯器為了對齊變
數,在
char
與
int
之間插入了未使用的補白位元組。一個被打包進記憶體的結構缺少補
白位元組,因此所耗用的記憶體比較少,但是無法符合架構的對齊需求。
擴大變數的對齊邊界
除了允許變數的打包,GCC 還允許程式設計者為特定的變數指定一個最小的對齊邊界。
於是 GCC 至少會把所指定的變數對齊此值,對照於架構和 ABI 所規定之最小對齊要
求。例如,下面這道敘述以 32 bytes 的最小對齊邊界(對照於具 32-bit 整數的機器上 4
bytes 的典型對齊邊界)來宣告一個名為
beard_length
的整數。
int beard_length __attribute__ ((aligned (32))) = 0;
強行設定資料型別的對齊邊界,通常僅用於處理「對齊需求大於架構本身的」硬體,或
是當你手動混合 ...