我有以下代码:位域结构尺寸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