我将 Visual Studio 2013 用于 x64 系统。
我有以下结构:

#pragma pack(1)
    struct TimeStruct
    {
      int milliseconds  : 10;
      BYTE seconds      : 6;
      BYTE minutes      : 6;
      BYTE hour         : 5;
      BYTE day          : 5;
    };
#pragma pack()

和一个数组:
TimeStruct stArray[10];

当我使用 sizeof(stArray); 时,结果是 80 而不是 40。

我需要知道问题是编译器没有正确打包还是 sizeof 没有考虑位域的实际大小。

谢谢

最佳答案

有关 MSVC 如何处理位域的更多说明,请参阅 What is VC++ doing when packing bitfields?

它的实现取决于位域的打包和排序方式,因此请注意布局可能与您期望的不同,并且取决于您使用的特定编译器。

sizeof() 为您提供结构的大小,而不管其成员是什么,因此位域打包与您的期望不同。

您可以从 documentation 中推测布局或使用此代码凭经验发现布局:

struct TimeStruct a;
unsigned char *b = (unsigned char*)&a;
a.milliseconds = 1;
a.seconds = 2;
a.minutes = 3;
a.hour = 3;
a.day = 4;
for(size_t i = 0; i < sizeof a; i++)
  printf("%02X ", b[i]);

 -> 64 bit compiler 01 00 00 00 02 03 04 05
 -> 32 bit compiler 01 30 FE 00 02 03 A4 65

看起来该结构为 1. int milliseconds : 10; 成员分配了一个完整的 int,然后其余 3 个字节单独打包,为每个成员分配一个 BYTE,但不组合来自不同分配单元的位。

如果对所有字段使用 int 或 unsigned int,您应该能够使用 MSVC 编译器将其紧密打包,并且此结构将占用 4 个字节:
struct TimeStruct
{
  int milliseconds : 10;
  int seconds      : 6;
  int minutes      : 6;
  int hour         : 5;
  int day          : 5;
};

关于c++ - sizeof pragma 打包位域结构数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28091060/

10-11 18:48