在C++中,警告"成员对齐对包装敏感"的含义是什么?

Pra*_*ram 12 c++ visual-studio-2005

在C++中,"成员对齐对包装敏感"的警告是什么意思?我正在使用Visual Studio 2005.

如何删除这些警告?我不想禁用它们顺便说一句.

Cas*_*Cow 13

某些数据类型必须与某个边界对齐.例如:

struct V
{
  char a;
  double b;
  char c;
  double d;
};
Run Code Online (Sandbox Code Playgroud)

sizeof(char)为1,sizeof(double)为8,但如果需要双精度对齐到8字节边界,则该结构的大小可能大于预期的18.在这种情况下,并且因为成员应该按照它们在结构中声明的顺序出现在内存中,可能有7个字节的"填充"靠近成员c,可能还有一些成员也是.

当包装是非标准的时候会出现危险,所以这个结构的大小可能会有所不同,你可以通过电线以"二进制"格式发送它,或者将它存储在一个文件中,在那里它将在其他地方读取(即使是字节序 - 双重的是相同的).

作为通过编译指示删除警告的建议的替代方法,您可以决定通过更改成员的顺序在代码中处理它.那些需要最大对齐的那些,以及后面的那些.首先是指针和双打,然后是整数,然后是短线和任何焦点成员.


Sac*_*hag 11

来自MSDN -

'符号':成员的对齐对包装敏感

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

// C4121.cpp
// compile with: /W4 /c
#pragma pack(2) // C4121
struct s
{
   char a;
   int b;
};
Run Code Online (Sandbox Code Playgroud)

您可以进行以下更改之一以防止出现此警告:

  • 更改pack(2)pack(4).
  • 颠倒结构成员的顺序,使其int先于char.

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

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

  • 为什么只发布一个网址?MSDN链接一直在破碎. (3认同)