簡體   English   中英

C90和C99中復合類型對象的對齊

[英]Alignment of compound type objects in C90 and C99

請考慮以下類型:

typedef struct { char myArray[300]; } MyStruct;
typedef union  { char myArray[300]; } MyUnion;

typedef struct { uint64_t x; } MyStruct2;
typedef union  { uint64_t x; } MyUnion2;

typedef struct { uint64_t x; char myArray[300]; } MyStruct3;
typedef union { uint64_t x; char myArray[300]; } MyUnion3;

我可以找到有關復合類型成員對齊和填充的信息,但是我不確定這些類型本身的對象。

在X86平台上使用C90和C99在RAM中的這些類型的對象有什么對齊規則? 對齊方式是否可以更改,例如因為優化程序刪除了未使用的成員(尤其是在工會中)?

對象的對齊由實現定義。 如果要設置特定值,則應使用編譯器特定的屬性。

編譯器不能合理地確定未使用成員,因此不會從聯合或結構中刪除“未使用”的成員(實際上,聯合是另一回事,因為“未使用”是什么意思?)。

我可以想到的唯一情況是,編譯器可以確定的是,僅在結構的編譯單元中創建靜態或自動變量時才將其傳遞給編譯單元外部的函數,並且永遠不會使用一個或多個成員在聲明中。 可能我忘記了一些無法勝任這一推理的事情。

我認為在所有其他情況下,編譯器無法確定未使用成員。 例如,如果將其傳遞給另一個編譯單元中的函數,則編譯器無法更改定義,因為另一個函數將依賴於該定義,並且可能正在使用此編譯單元中未使用的成員。

對於聯合,編譯器永遠無法確定,因為成員的內存是共享的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM