次の方法で共有


コンパイラの警告 (レベル 4) C4121

'symbol' : メンバーのアラインメントは過剰にパッキングされています

コンパイラは、パッキング境界で構造体メンバーをアラインするために埋め込みを追加しましたが、パッキング値はメンバーのサイズを下回ります。 たとえば、次のコード スニペットでは C4121 が生成されます。

// C4121.cpp
// compile with: /W4 /c
#pragma pack(2)
struct s
{
   char a;
   int b; // C4121
   long long c;
};

この問題を解決するには、次のいずれかの変更を行います。

  • パッキング サイズを、警告を発生させたメンバーのサイズまたはそれ以上の値に変更します。 たとえば、このスニペットでは、pack(2)pack(4) または pack(8) に変更します。

  • メンバー宣言をサイズに基づいて降順に並べ替えます。 このスニペットでは、構造体メンバーを逆の順序に並べ替えます。つまり、long long メンバーを int の前に配置し、intchar の前に配置します。

この警告は、コンパイラがデータ メンバーの前に埋め込みを追加した場合にのみ発生します。 パッキングによってデータ型用にアラインされていないメモリ位置にデータが配置されたが、データ メンバーの前に埋め込みが追加されなかったときは発生しません。 データのサイズの倍数となる境界でデータがアラインされていないと、パフォーマンスが低下する可能性があります。 アラインされていないデータの読み取りおよび書き込みにより、一部のアーキテクチャでプロセッサ障害が発生した場合は、その障害の解決に桁違いの時間がかかる場合があります。 アラインされていないデータのアクセスは、一部の RISC アーキテクチャには移植できません。

#pragma pack または /Zp を使用すると、構造体のアラインメントを指定できます (/Zp1 が指定されている場合、この警告は生成されません)。