我有以下代碼:位域結構尺寸gcc和MSFT CL之間不同
#include <cstdint>
#pragma pack(1)
using MyType_t = union {
uint8_t buffer[16];
struct {
uint64_t a : 55;
uint64_t b : 24;
uint64_t c : 1;
uint64_t d : 48;
}fields;
};
#pragma pack()
int main()
{
return sizeof(MyType_t);
}
我得到的gcc \鐺和Visual C之間不同的結果++(微軟CL), 當我比較彙編代碼在編譯器Explorer和我得到了以下:
鐺(-std = C++ 11 -O3)
main: # @main
mov eax, 16
ret
X86-64 GCC 6.3(-O3)
main:
mov eax, 16
ret
x86-64的CL 19 2017 RTW(-Ox)
main PROC
mov eax, 24
ret 0
main ENDP
是它Visual C++編譯錯誤或它是未定義的行爲?
幾乎所有與bitfeilds是實現定義的行爲。最有可能的是你看到的是gcc/clang很聰明,並且將4個字段優化成2個'uint64_t's,其中msvs增加了一個,所以你沒有一個跨越兩個'uint64_t'的位文件。 – NathanOliver