警告は、必ずしも何か間違ったことをしたことを意味するわけではありませんが、この動作を意図していなかった可能性があることを示しています。コンパイラは、開発者が警告する価値があると考えたものについて警告することが許可されていることに注意してください。原則として、13 日の金曜日にコンパイルすることについて警告を受けることもできます。
この特定のケースでは、アラインメントを指定するときに、クラスを大きくしたくないという想定がおそらくあります。したがって、指定したアライメント要件のためにクラスが大きくなった場合、間違いを犯した可能性は低くありません。
もちろん、なぜアラインメント要件がクラスを大きくするのかという疑問が残ります。これで、標準の世界に戻りました (ただし、__declspecそれ自体は Microsoft の拡張機能であり、標準ではありません)。C++ 標準では、配列内でオブジェクトが間にスペースを入れずに連続している必要があります。したがって、オブジェクトを 16 バイト境界に揃える必要がある場合、オブジェクトのサイズは 16 の倍数でなければなりません。メンバーのサイズ (明示的および暗黙的の両方) が必要なサイズを与えない場合、コンパイラは未使用のバイトをオブジェクトに追加します。これらのバイトはパディングと呼ばれます。このパディングは、配列のメンバーではないオブジェクトにも存在することに注意してください。
現在、クラスには暗黙的な仮想ポインターのみが含まれています (仮想関数が含まれているため)。アーキテクチャによっては、おそらく 4 または 8 バイトの大きさです。16 バイトのアラインメントを要求したため、コンパイラは、サイズを 16 の倍数にするために 12 または 8 バイトのパディングを追加する必要があります。そして、これはコンパイラが警告するものです。