2011-09-28 80 views
4

如果你有一個結構內的結構,說:內存對齊(用C專)

struct { 
    double a; 
    struct { 
     char *b[20]; 
     char c; 
    }d; 
}e; 

將結構E需求開始在結構尺寸d,或倍數的多d(char * b [20])的最大成員的大小?

回答

4

這是編譯器和設置相關的。在大多數情況下,將從第一個成員的粒度開始,在你的情況下是sizeof(char*)。請注意,它不是​​3210,因爲它是一個數組而不是本機類型。另外請注意,在你的情況下,struct e將始終至少以粒度sizeof(double)開始,因此struct d也會這樣做。

+0

根據平臺的不同,double可能不需要'sizeof(double) '對齊。看到我的答案。 –

+0

@ughoavgfhw:你是對的:錯過了明星。修復了答案 – Rom

+0

感謝您的幫助! – Max

5

結構e將開始於任何成員必需的對齊,並且整個結構是可訪問的。

對於不同的實現會有所不同。

我們知道,e對齊將至少嚴格的alignmentf爲double至少嚴格爲e.d對準 - 和e.d對齊將至少同樣嚴格其成員的路線。

與其他答案相反,標量類型的對齊不一定與其大小相同。例如,double可能是8個字節,但只需要4個字節的對齊。將每個標量類型(整數,浮點,指針)對齊到其全尺寸是相當普遍的,但它不是通用的。

並且注意對齊的最優可能比對齊要求更嚴格。在x86上,據我瞭解,CPU可以訪問任何字節邊界上的對象 - 但訪問正確對齊的對象效率更高。 (在其他CPU上,未對齊的訪問可能需要軟件支持。)編譯器通常會對齊對象以獲得最大效率(但可能會提供非標準擴展以節省空間)。

但是,對於一個類型的對齊不能超過其大小的。例如,不能有需要4字節對齊的3字節類型。數組之間不能有元素之間的差距。 (在這種情況下,編譯器可能會將該類型填充到4個字節;填充將成爲對象的一部分,不會插入到對象之間)。

+0

非常翔實的答案,但是這是一個家庭作業,所以我不認爲我的教授想讓我得到太深:) – Max

+0

我剛剛添加了一個家庭作業標籤到您的文章。 –