【发布时间】:2017-09-16 04:16:24
【问题描述】:
我有以下代码:
#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) 之间得到不同的结果, 当我在 Compiler Explorer 中比较汇编代码时,我得到以下信息:
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++ 编译器错误还是未定义行为?
【问题讨论】:
-
几乎所有带有 bitfeilds 的东西都是实现定义的行为。您最有可能看到的是 gcc/clang 很聪明,并将 4 个字段优化为 2 个
uint64_ts,其中 msvs 添加了一个额外的字段,因此您没有跨越两个uint64_ts 的位文件
标签: c++ c++11 gcc visual-c++ bit-fields