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时,编译器不会生成此警告.