2012-01-11 76 views
4
#define MAX_SIZE 8 

enum my_enum 
{ 
    VAL1 = 0; 
    VAL2, 
    VAL3, 
    VAL4, 
    VAL_MAX 
}; 

struct my_struct 
{ 
    enum my_enum e; 
    int w[MAX_SIZE]; 
}; 

此類結構中的佈局是否會導致目標平臺上的對齊問題?我理解在很大程度上取決於在一個平臺上,但一般C編譯器被允許做結構的填充,因此,例如32位機,其中「INT」是32位長的上:結構對齊

struct my_struct 
{ 
    int w[MAX_SIZE]; 
} 

對準(如FAS據我所知),所以編譯器可能不會對其佈局做任何事情,但在結構中添加'enum my_enum'可能會使結構在此類機器上非對齊。我應該做什麼特別的事情來避免這種情況,我應該避免它嗎?

非常感謝澄清!

馬克

+0

如果您認爲結構僅僅是元素的總和,您確實需要擔心。例如'struct my_struct * p = malloc(sizeof(my_enum)+ n * sizeof(int))'嘗試分配少於MAX_SIZE的整數。但如果有填充,最終分配太少。 – ugoren 2012-01-11 19:21:16

回答

6

答案是否定的,你不必做任何事情。如果添加一個字段會破壞對齊,編譯器將在適當的位置應用填充以重新對齊。

在你的情況下,enum很可能被實施爲int所以你不會有這個問題擺在首位。

一個更好的例子將是:

struct my_struct 
{ 
    char ch; 
    int w[MAX_SIZE]; 
}; 

在這種情況下,編譯器將有可能把3個字節的填充ch後保持w對齊的4個字節。

0

不,你不必考慮對齊方式是否「有用」。基本上是由編譯器來調整目標平臺的工作。如果它很聰明,它甚至會以最大的性能表現。例如,如果首先有一個字符,那麼整數和目標平臺允許未對齊的加載/存儲,編譯器可能會生成結構爲5個字節,整數未對齊。如果你想保證4字節對齊,你需要做的

struct my_struct { 
    char a; 
    char dummy[3]; 
    int b; 
} 

或把從最大到最小的數據類型的結構,以獲得最佳的性能。

編輯:我已經指出,規範可能已經收緊了這種行爲,所以大多數(如果不是所有的)現代編譯器現在都將自然邊界上的所有內容對齊。

+0

編譯器可能會或可能不會對齊「自然」邊界上的成員。它*必須*以這樣一種方式排列所有成員,使其可以被正確訪問。例如,給定'struct my_struct obj; int * ptr = &obj.b;',引用'* ptr'必須工作。 (編譯器特定的打包編譯指示和屬性可以打破這種情況;例如,請參閱[此問題](例如,http://stackoverflow.com/questions/8568432/is-gccs-attribute-packed-pragma-pack-unsafe)。) – 2012-01-11 22:14:58

0

你不需要關心試圖不引入填充。如果您想嘗試演示結構成員的順序如何或不可能有所作爲,您可以嘗試使用this。 (它不打算演示特定的實現如何表現)。根據C11標準,所有對齊是2的冪。

簡單的數學表明,對象的對齊要求不可能超過其大小,除非也不可能創建這樣的對象的數組。