我有以下代码:
#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\clang 和 Visual C++ (Microsoft CL) 之间得到不同的结果, 当我在编译器资源管理器中比较汇编代码时,我得到以下结果:
clang(-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++ 编译器错误还是未定义行为?
最佳答案
我认为这是未定义的行为。 @NathanOliver 有正确的答案:GCC 和 Clang 跨越两个 uint64_t
值。不过,阅读它是有代价的:请参阅 Compiler Explorer 上这个非常相似的代码示例。 GCC 现在必须读取两个字段并进行一些数学运算才能给出第二个值。
关于c++ - gcc 和 MSFT CL 之间的位域结构大小不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504113/