gpt4 book ai didi

c++ - 在 MSVC 中强制未对齐的位域打包

转载 作者:可可西里 更新时间:2023-11-01 15:22:11 26 4
gpt4 key购买 nike

我有一个加起来为 48 位的位域结构。在 GCC 上,这会正确地生成一个 6 字节的结构,但在 MSVC 中,该结构会出现 8 个字节。我需要找到一些方法来强制 MSVC 正确打包结构,既为了互操作性,也因为它在内存关键环境中使用。

下面看到的结构由三个 15 位数字、一个 2 位数字和一个 1 位符号组成。 15+15+15+2+1 = 48,所以理论上它应该能装进六个字节,对吧?

struct S
{
unsigned short a:15;
unsigned short b:15;
unsigned short c:15;
unsigned short d:2;
unsigned short e:1;
};

但是,在 GCC 和 MSVC 上编译它会导致 sizeof(S) == 8。认为这可能与对齐有关,我尝试使用 #pragma pack(1)在结构声明之前,告诉编译器回到字节边界,而不是整数边界。在 GCC 上,this worked ,导致 sizeof(S) == 6

但是,在 MSVC05 上,即使设置了 pack(1),sizeof 仍然是 8!看完this other SO answer ,我尝试将 unsigned short d 替换为 unsigned char 并将 unsigned short e 替换为 bool。结果是 sizeof(S) == 7!

我发现,如果我将 d 分成两个一位字段并将它们楔入其他成员之间,该结构最终会正确打包。

struct S
{
unsigned short a:15;
unsigned short dHi : 1;
unsigned short b:15;
unsigned short dLo : 1;
unsigned short c:15;
unsigned short e:1;
};

printf( "%d\n", sizeof(S) ); // "6"

但是像那样拆分 d 很麻烦,并且在我以后必须处理该结构时给我带来麻烦。有没有什么方法可以强制 MSVC 将这个结构打包成 6 个字节,就像 GCC 所做的那样?

最佳答案

字段在结构中的放置方式由实现定义。如果可以,Visual Studio 会将连续的位域放入基础类型,并浪费剩余空间。 ( C++ Bit Fields in VS )

关于c++ - 在 MSVC 中强制未对齐的位域打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4310728/

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