C++中警告"成员的对齐受到打包的影响"是什么意思? 我正在使用Visual Studio 2005。
如何去除这些警告?我不想禁用它们。
C++中警告"成员的对齐受到打包的影响"是什么意思? 我正在使用Visual Studio 2005。
如何去除这些警告?我不想禁用它们。
一些数据类型必须对齐到特定的边界。例如:
struct V
{
char a;
double b;
char c;
double d;
};
sizeof(char)为1,sizeof(double)为8,但如果该结构需要将双精度对齐到8字节边界,则其大小可能会超过预期的18个字节。在这种情况下,并且因为成员应按照它们在结构中声明的顺序出现在内存中,因此在与成员c相邻的地方可能会有7个字节的“填充”,也可能会有一些与成员a相关的填充。
危险在于,如果打包是非标准的,则此结构的大小可能会变化,并且您将以“二进制”格式将其发送到网络或存储在文件中,在其他地方读取它(即使双精度的字节序相同)。
作为通过使用编译指示来消除警告建议的替代方法,您可以通过更改成员的顺序来在代码中处理它。最先放置需要最大对齐的指针和双精度,在后面放置整数,然后是short和任何char成员。
取自MSDN -
'symbol' : 成员的对齐方式受到打包的影响。
结构成员在内存偏移量上对齐,其值不是成员大小的倍数。例如,以下代码片段将产生此警告:
// C4121.cpp
// compile with: /W4 /c
#pragma pack(2) // C4121
struct s
{
char a;
int b;
};
您可以通过以下方式之一来避免此警告:
pack(2)
更改为pack(4)
。int
在char
之前。当数据未对齐到数据大小的倍数边界时,性能可能会降低。如果您将代码移植到RISC机器上,则无法编译。
您可以使用#pragma pack或/Zp指定结构对齐方式。请注意,在指定/Zp1时,编译器不会生成此警告。