gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:22 25 4
gpt4 key购买 nike

我有以下代码:

#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++ 编译器错误还是未定义行为?

最佳答案

我相信这是未定义的行为。 @NathanOliver 的答案是正确的:GCC 和 Clang 跨越两个 uint64_t 值。不过,阅读它是有代价的:请参阅 Compiler Explorer 上的这个非常相似的代码示例GCC 现在必须读取两个字段并进行一些数学计算以给出第二个值。

关于c++ - gcc 和 MSFT CL 之间的位域结构大小不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com