簡體   English   中英

sizeof沒有顯示預期的輸出

[英]sizeof not showing the expected output

#include <stdint.h>
#include <stdio.h>

typedef union {
    uint64_t u[2];
    struct {
        uint64_t a:30;
        uint64_t b:30;
        uint64_t c:30;
        uint64_t d:30;
        uint64_t e:8;
    }x;
} mystruct;

int main()
{
    printf("Size %d\n", sizeof(mystruct));
}

我想在64位機器上編譯它。 預期的輸出是16但我得到24.我知道這里發生了一些對齊,但我不確定為什么結構x正好是16個字節。 有人可以解釋一下嗎。 謝謝

從C標准:

(C99,6.7.2.1p10)“[......]如果剩余空間不足,是否將不適合的位域放入下一個單元或重疊相鄰單元是實現定義的。”

所以在你的實現中它們不重疊: ab成員在一個單元中, cd在另一個單元中, e在另一個單元中: 8 + 8 + 8 = 24

對於64位機器,字段ab使用結構中第一個64位值的60位, cd使用結構中下一個64位值的60位,然后因為e是8位不能適應該64位值剩余的4位,因此需要另一個64位值。 因此8x3 = 24字節。

位字段的元素永遠不會與兩個存儲器“單元”重疊(在您的情況下,存儲器單元是64位元素)。

除了位域實現依賴於編譯器這一事實之外,您的位域結構有可能以下列方式實際存儲在內存中:

struct {
    uint64_t a:30;
    uint64_t b:30;
    uint64_t :4;
    uint64_t c:30;
    uint64_t d:30;
    uint64_t :4;
    uint64_t e:8;
    uint64_t :56;
}x;

暫無
暫無

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

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