c++ - gcc 和 MSFT CL 之间的位域结构大小不同

标签 c++ c++11 gcc visual-c++ bit-fields

我有以下代码:

#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/

相关文章:

c++ - ADO 命令执行失败

c++ - 在编译时确定类型是否为 STL 容器

c++ - 为什么我收到以下错误 : "no match for ' operator= ='" ?(带有模板的嵌套类)

python - Gcc、Python 和 Google 计算器中的大 float 计算错误

c++ - 将变量的名称传递给 C++ 中的函数

c++ - 我的代表不显示复选框

c++ - 未定义对 "***"的引用

c++ - C++ 中的最新调用

c++ - 将 Vector 的第一个元素 move 到最后一个元素

c++ - 在 C++ 中为变量分配作用域