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

标签 c++ c visual-studio

我有一个加起来为 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/

相关文章:

c++ - int 到字符串,char* itoa

c++ - 为什么选择非常量版本而不是类的 const 版本?

c++ - 从未定义它的基类调用纯虚函数?

c++ - 无法将 insert() 结构插入 unordered_set

c - Eclipse 编辑器中多行 C/C++ 宏的快捷方式

c - 使用 extern struct 或 extern pointer to struct 的最佳实践?

c++ - memcpy 没有按预期进行

c# - NuGet包如何知道它们的 `using`指令?

visual-studio - Visual Studio 2010 : "value does not fall within expected range" when trying to create a content type

c# - 命名空间 'Practices' 中不存在类型或命名空间名称 'Microsoft'