2012-07-17 76 views
2

我的編譯器要求我有一個內存對齊的結構聲明,以確保正確的數據訪問。 我有一個頂級結構,其中包含一些其他結構。是否足以確保頂層結構與32字節邊界對齊,或者我需要確保每個結構都應該與32字節邊界對齊。 代碼片段如下: -結構對齊問題

typedef struct { 
    int p; 
    int q; 
    char n; 
} L; 

typedef struct { 
    int c; 
    int d; 
    char e; 
    L X2[13]; 
} B; 

typedef struct { 
    int a; 
    int b; 
    B X1[10]; 
} M; 

爲了確保正確的數據訪問,我需要確保所有的結構都存儲正確對齊,或填充最上面的結構將保證內存對齊。

+3

夠用了麼? – 2012-07-17 18:43:04

+0

良好的內存對齊的目的,以便它提供了穩定的讀/寫訪問結構數據。 – Viks 2012-07-17 18:44:58

+0

就目前而言,你所有的結構可能只有'int'的對齊。 – 2012-07-17 18:45:22

回答

2

有時您的應用程序可能需要特殊的佈局,但如果你在這種情況下,說這是你的編譯器的要求(或者可能更準確地你的編譯器的目標架構),那麼它是編譯器的責任,以確保這些要求得到滿足。

如果您需要的對齊方式不同於編譯器自然按照目標要求強制執行的對齊方式,則需要編譯器特定的指令來進行打包和對齊;然而,應用這樣的指令並使其錯誤更有可能導致對齊錯誤,而不是讓編譯器處理它。如果嘗試通過添加自己的填充成員來對齊,它可能會起作用,但是不必要,編譯器也可以插入其自己的填充。

重點是編譯器不會生成一個結構的成員,它不能安全有效地解決。它將在成員之間插入任何必要的填充以確保後續成員可尋址。

如果你不相信它會工作,讓你的鏈接器輸出一個地圖文件(如果它不這樣做),並檢查這些符號的地址,以驗證正確的對齊方式。還要看結構的生成大小;你可能會發現它們中的一些比它們的部分總和大 - 這是編譯器通過插入填充來強制對齊。

0

如果您想使用自然對齊方式,則必須訂購 字段並手動填充自然字大小。可移植性 不能保證,但對於特定的處理器,這可以完成 (在嵌入式世界中並不罕見)。如果sizeof(int)是4 你必須添加填充到你的子結構中以確保在數組中對齊 (我假設你的目標是避免編譯器添加的「祕密」填充 ?)。例如:

typedef struct { 
    int p; 
    int q; 
    char n; 
    char pad[3]; 
} L; 

typedef struct { 
    int c; 
    int d; 
    char e; 
    char pad[3]; 
    L X2[13]; 
} B; 

typedef struct { 
    int a; 
    int b; 
    B X1[10]; 
} M; 

通常會導致結構中沒有「隱藏」對齊。