網頁

2008年3月1日 星期六

介紹#pragma pack()

#pragma是用來設定complier的選項,跟你在complier後加 -Zp -Xk 等等設定
是一樣的。
#pragma pack(n)是用來讓struct的成員對齊記憶體用的,在32bit系統
下基於處理器效率的考量,預設的對齊位置是4 bytes,所以所有的struct成員視為
#pragma pack(4),但有時候我們希望struct裡成員是連績的,尤其是控制硬體相關
的io位置,所以會設為#paragma pack(1),讓struct的成員不要對齊。
看以下例子:
struct pci_conf {
WORD VendorID;
WORD DeviceID;
...
} pci;
如果沒有用#pragma pack(1),VendorID後會空2 bytes不用,以便對到4 bytes
(假設一開始是對齊的),然後才配置DeviceID。
可是若沒留意這樣的問題,
(BYTE*) p = &pci;
預期*(p+0x2)是DeviceID就會出問題。


如果你只有某一塊要特殊的alignement
#pragma pack(push, n)...#pragma pack(pop)

沒有留言:

張貼留言