私は48ビットまでのビットフィールドの構造体を持っています。 GCCでは、これは正しく6バイト構造になりますが、MSVCでは構造が8バイトになります。 MSVCに構造体を適切にパックするような方法を見つけ出す必要があります。これは、相互運用性のため、またメモリが重要な環境で使用されているためです。MSVCのアラインされていないビットフィールドのパッキングを強制する
構造体は、3つの15ビット数、1つの2ビット数、および1ビットの符号で構成されています。 15 + 15 + 15 + 2 + 1 = 48だから理論的には6バイトに収まるはずですよね?
struct S
{
unsigned short a:15;
unsigned short b:15;
unsigned short c:15;
unsigned short d:2;
unsigned short e:1;
};
しかし、sizeof(S) == 8
の両方のGCCとMSVCの結果でこれをコンパイルします。これはアラインメントと関係があると思われるので、構造体宣言の前に#pragma pack(1)
を使用して、コンパイラにintではなく境界に戻るように指示しました。 GCCでは、this workedであり、結果としてsizeof(S) == 6
となる。
ただし、MSVC05では、pack(1)
を設定しても、サイズはまだ8になりました! this other SO answerを読んだ後、unsigned char
とunsigned short e
をbool
に置き換えようとしました。結果はsizeof(S)
== です!
dを2つの1ビットフィールドに分割し、それらを他のメンバーの間に詰め込むと、構造体が最終的に正しくパックされていることがわかりました。
struct S
{
unsigned short a:15;
unsigned short dHi : 1;
unsigned short b:15;
unsigned short dLo : 1;
unsigned short c:15;
unsigned short e:1;
};
printf("%d\n", sizeof(S)); // "6"
しかし、それは面倒であり、後に、私は構造体で仕事をしなければならないときに私のために、トラブルの原因となるようDスプリットを持ちます。 MSVCにGCCのようにこの構造体を6バイトにパックする方法がありますか?
参考になっていただきありがとうございます。 – Crashworks
優れたリファレンス!私の問題を助けました。(VC++は16ビットのビットフィールドを4バイト構造にしていました。 – nirbruner