以下の宣言を考えてみましょう。(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>
場合、警告なしでコンパイルできます。2 つのケースの構造レイアウトは同じで、"b" のオフセットは 2 バイトです。"b" が境界の倍数に配置されていない
ため、C4121 を期待していました。( MSDNから。2010バージョンは見つかりませんでした。)<case 2>
sizeof(int)
質問
<case 1>
結果として得られる構造のレイアウト (アライメント) は同じなので、C4121のみを生成することが合理的であるかどうか疑問に思います。
私は何か重要なものを見逃していますか?C4121 を無視する必要がありますか?
PS
実際、私はこのような状況に直面していました
- デフォルトのアラインメント値 (8 バイト)
- 未定義 (前方宣言のみ) クラスのメンバ関数へのポインタ (16 バイト)。
したがって、特定のアライメント値は重要ではないと思います。簡単にするために上記のサンプルコードを書きました。