在C++中,“成员的对齐方式受到打包的敏感性”警告意味着什么?

12

C++中警告"成员的对齐受到打包的影响"是什么意思? 我正在使用Visual Studio 2005。

如何去除这些警告?我不想禁用它们。


1
如果您需要更具体的帮助,您应该发布结构的定义。 - Björn Pollex
2个回答

13

一些数据类型必须对齐到特定的边界。例如:

struct V
{
  char a;
  double b;
  char c;
  double d;
};

sizeof(char)为1,sizeof(double)为8,但如果该结构需要将双精度对齐到8字节边界,则其大小可能会超过预期的18个字节。在这种情况下,并且因为成员应按照它们在结构中声明的顺序出现在内存中,因此在与成员c相邻的地方可能会有7个字节的“填充”,也可能会有一些与成员a相关的填充。

危险在于,如果打包是非标准的,则此结构的大小可能会变化,并且您将以“二进制”格式将其发送到网络或存储在文件中,在其他地方读取它(即使双精度的字节序相同)。

作为通过使用编译指示来消除警告建议的替代方法,您可以通过更改成员的顺序来在代码中处理它。最先放置需要最大对齐的指针和双精度,在后面放置整数,然后是short和任何char成员。


12

取自MSDN -

'symbol' : 成员的对齐方式受到打包的影响。

结构成员在内存偏移量上对齐,其值不是成员大小的倍数。例如,以下代码片段将产生此警告:

// C4121.cpp
// compile with: /W4 /c
#pragma pack(2) // C4121
struct s
{
   char a;
   int b;
};
您可以通过以下方式之一来避免此警告:
  • pack(2)更改为pack(4)
  • 反转结构成员的顺序,使intchar之前。

当数据未对齐到数据大小的倍数边界时,性能可能会降低。如果您将代码移植到RISC机器上,则无法编译。

您可以使用#pragma pack或/Zp指定结构对齐方式。请注意,在指定/Zp1时,编译器不会生成此警告。


3
为什么只发一个网址?MSDN链接随时可能失效。 - Anders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接