8
  • ビットフィールドは C の概念ですか、それとも C++ ですか?

  • 構造内でのみ使用できますか? それらを使用できる他の場所は何ですか?

  • 私の知る限り、ビットフィールドは、指定された数だけメモリを占有する特別な構造変数です。ビットの。メモリを節約するのに役立ちますが、他には何もありません。私は正しいですか?

ビットフィールドの使用法を理解するために小さなプログラムをコーディングしましたが、期待どおりに動作していないと思います。以下の構造体のサイズは 1+4+2 = 7 バイトであると予想しています (私のマシンでは unsigned int のサイズが 4 バイトであることを考慮すると)、しかし驚いたことに、12 バイトであることが判明しました (4+4+4 )。誰でも理由を教えてもらえますか?

#include <stdio.h>

struct s{
unsigned int a:1;
unsigned int b;
unsigned int c:2;
};

int main()
{
  printf("sizeof struct s = %d bytes \n",sizeof(struct s));
  return 0;
}

出力:

sizeof struct s = 12 bytes 
4

5 に答える 5

12

acは連続していないため、それぞれが完全な int に相当するメモリ空間を予約します。aと を一緒に移動するとc、構造体のサイズは 8 バイトになります。

さらに、1バイトではなく1ビットaのみを占有することをコンパイラーに伝えています。したがって、とが隣り合って占有するのは合計 3 ビット (まだ 1 バイト未満) であるはずですが、 と の組み合わせは32ビット マシンのメモリ内でワード アラインされるため、整数。acacb

同様に、次のことがわかります。

struct s{
unsigned int b;
short s1;
short s2;
};

8 バイトを占有しますが、

struct s{
short s1;
unsigned int b;
short s2;
};

後者の場合、2 つの short がそれぞれ独自の 32 ビット アラインメントに配置されるため、12 バイトを占有します。

于 2010-01-15T12:06:31.120 に答える
8

1) それらは C で生まれましたが、残念ながら C++ の一部でもあります。

2) はい、または C++ のクラス内。

3) メモリを節約するだけでなく、ある種のビット操作にも使用できます。ただし、メモリの節約と調整は本質的に実装に依存します。移植可能なソフトウェアを作成する場合は、ビット フィールドを避けてください。

于 2010-01-15T12:07:04.887 に答える
0

その C.

あなたのコミラーは、アラインメントのためにメモリ割り当てを 12 バイトに丸めました。ほとんどのコンピュータ メモリ サブシステムは、バイト アドレッシングを処理できません。

于 2010-01-15T12:07:50.323 に答える
0

あなたのプログラムは、私が期待したとおりに動作しています。コンパイラは隣接するビットフィールドを同じメモリ ワードに割り当てますが、それらは非ビットフィールドで区切られています。

ビットフィールドを隣り合わせに移動すると、おそらく 8 になります。これは、マシンの 2 つの int のサイズです。ビットフィールドは 1 つの int にパックされます。ただし、これはコンパイラ固有です。

ビットフィールドはスペースを節約するのに役立ちますが、それ以外にはあまり役に立ちません。

于 2010-01-15T12:08:40.523 に答える