2010-10-08 52 views

回答

13

某些數據類型必須與某個邊界對齊。因此,例如:

struct V 
{ 
    char a; 
    double b; 
    char c; 
    double d; 
}; 

的sizeof(char)的是1和sizeof(雙)是8,但該結構的大小可以比預期的18更多,如果需要的雙打對齊到8字節邊界。在這種情況下,並且因爲成員應該按照它們在結構中聲明的順序出現在內存中,所以可能會有7個字節的「padding」靠近成員c,並且可能有一些成員也是。

當包裝非標準化時,這個危險就來了,因此這個結構體的大小可能會有所不同,並且您可以通過電線以「二進制」格式發送它,或將其存儲在文件中,以便在其他位置讀取它如果這個double的endian-ness是一樣的)。

作爲通過編譯指示刪除警告的建議的替代方法,您可以決定通過更改成員的順序來處理代碼。把那些需要最大的路線放在第一位,然後放低一些。所以先把指針和雙打,然後整數,然後短褲和任何字符成員最後。

11

MSDN摘自 -

「符號」:一個構件的對準是包裝

的結構構件上的存儲器偏移量,其值是不構件的大小的倍數對齊敏感。例如,下面的代碼片段會產生這樣的警告:

// C4121.cpp 
// compile with: /W4 /c 
#pragma pack(2) // C4121 
struct s 
{ 
    char a; 
    int b; 
}; 

你可以做以下更改之一,以防止此警告:

  • 變化pack(2)pack(4)
  • 顛倒結構成員的順序,使intchar之前。

當數據不屬於數據的大小性能會下降的倍數邊界,如果你的代碼移植對準RISC機器也不會編譯。

您可以使用#pragma pack或/ Zp指定結構對齊方式。請注意,當指定/ Zp1時,編譯器不會生成此警告。

+3

爲什麼只發佈一個網址? MSDN鏈接一直在打破。 – Anders 2010-10-08 09:09:12

相關問題