簡體   English   中英

C結構中的數組是否對齊?

[英]C Are arrays in structs aligned?

struct {
    uint8_t foo;
    uint8_t bar;
    uint8_t baz;
    uint8_t foos[252];
    uint8_t somethingOrOther;
} A;

struct {
    uint8_t foo;
    uint8_t bar;
    uint8_t baz;
    uint8_t somethingOrOther;
    uint8_t foos[252];
} B;

在第一個示例中將foos放在字節3上,而在B的字節4上放置foos是否重要?

C中的數組是否必須開始對齊?

這個結構的大小是否精確為256個字節?

假定數據類型為uint8_t (與unsigned char等效),則無需對結構進行填充,無論其順序如何。 因此,在這種情況下,您可以合理地假設,每個編譯器都將使該結構變成256個字節,而與元素的順序無關。

如果數據元素的大小不同,那么您很可能會添加填充,結構的大小可能會根據元素的順序而有所不同。

好書所述 (C11第6.7.2.1節第14段):

結構或聯合對象的每個非位字段成員都以適合於其類型的實現定義的方式對齊...結構對象內可能存在未命名的填充

您沒有“將foos放在字節3上”-除了第一個元素始終位於字節0上的事實之外,您無法真正控制將元素放在哪個字節上。 如果編譯器認為可以提供最有效的訪問,則可以為每個字段提供完整的機器字,甚至更多。 如果是這樣,它將在這兩個未分配空間之間分配“填充”字節。

注意,這僅適用於結構。 數組本身不添加任何填充字節(如果這樣做,則指針算術/索引規則將不起作用),因此您可以確定foos本身的大小恰好是聲明的大小,並且知道每個編號的確切對齊方式元件。

不,沒關系。

幾乎所有在那里的編譯器都可以通過在必要時在字段之間插入隱藏的“填充字節”來將struct字段與適合目標體系結構的自然邊界對齊。

具體來說,由於僅使用uint8_t ,因此不會插入填充字節-每個字段都已經落在自然對齊的邊界上。 (一切都是一個的倍數。)

您顯示的兩個struct的大小都恰好為256個字節。 您可以這樣確認:

int main(void)
{
    printf("sizeof(struct A)=%zu \n", sizeof(struct A));
    printf("sizeof(struct B)=%zu \n", sizeof(struct B));
}

您可以通過“打包”結構來防止添加此填充:

請注意,在成員不對齊的結構上執行此操作會嚴重影響程序的性能。

暫無
暫無

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

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