何が
プラグマパック(2)
行う?どういう意味ですか?
これは、構造体、共用体、またはクラスが 2 バイトでアラインされていることを意味します。つまり、次の構造体はメモリ内で 2 バイトではなく 3 バイトを使用します。
struct MyStruct
{
char Field1;
char Field2;
};
以下は 4 バイトを使用します。
struct MyStruct
{
WORD Field1;
WORD Field2;
};
詳細はこちら: http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx . 重要: 問題について読み、自分が何をしているのかを理解していて必要な場合にのみ使用してください ;-)
pragmaこれは、s 内のメンバーの配置方法を変更する Visual Studio 固有のディレクティブですstruct。完全な詳細はMSDN のこちらにありますが、その要点は、a の要素間に配置されるパディングの量をカスタマイズできることですstruct。詰め物をきつく詰めると、使用するスペースが少なくなりますが、配置の問題が発生する可能性があります。
つまり、構造体の最初のメンバーに続くプラグマの後に宣言された構造体、クラス、またはユニオンの各メンバーは、メンバータイプのサイズまたは2バイト境界のいずれか小さい方の倍数で格納されます。
#pragma pack(n)は、それに続く構造、クラス、およびユニオンのサイズに影響します。
ファイルレベルで使用する場合は、パッキングアライメントを変更する前に保存し、新しいパッキングアライメントを適用する宣言が終了したときに、以前の値に戻すことをお勧めします。
そしてもちろん、コンパイラのドキュメントを確認する必要があります。
MS VS 6.0の場合:ここを参照してください。
これは、コンパイラが struct/class/union メンバーを 2 バイト境界に整列するようにパックする必要があることを意味します。
struct Foo {
char c1;
int i1;
};
pack(2) を使用すると、構造体は次のようになります。
すべてのプラグマはコンパイラ固有であることに注意してください。ただし、これは VC と gcc の両方で動作します。