让我们考虑下面的声明。(Visual Studio 2010,警告级别 4)
#pragma pack(push, 2)
#define PADDING 1 // --- <case 1>
/*
#define PADDING 2 // --- <case 2>
*/
struct foo
{
char a[PADDING];
int b;
};
症状
如果将PADDING设置为<case 1>
,肯定会产生C4121。但是对于<case 2>
,它可以在没有任何警告的情况下编译。这两种情况具有相同的结构布局,“b”的偏移量为 2 个字节。
我期望 C4121 为<case 2>
,因为“b”未在边界的倍数上对齐sizeof(int)
。(来自MSDN。我找不到 2010 版本。)
问题
<case 1>
我想知道只生产 C4121是否合理,因为结果结构布局(对齐)是相同的。
我错过了什么重要的东西吗?我应该忽略 C4121 吗?
附言
实际上,我曾经遇到过这种情况
- 默认对齐值(8 个字节)
- 指向未定义(仅前向声明)类的成员函数的指针(16 个字节)。
所以,我认为具体的对齐值不是重点。我已经编写了上面的示例代码以使事情变得简单。