[英]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)“[......]如果剩余空間不足,是否將不適合的位域放入下一個單元或重疊相鄰單元是實現定義的。”
所以在你的實現中它們不重疊: a
和b
成員在一個單元中, c
和d
在另一個單元中, e
在另一個單元中: 8 + 8 + 8 = 24
。
對於64位機器,字段a
和b
使用結構中第一個64位值的60位, c
和d
使用結構中下一個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.