6

同じデータ型のビットフィールドが混合データ型の場合よりもサイズが小さい理由を知りたいです。

struct xyz 
{ 
  int x : 1; 
  int y : 1; 
  int z : 1; 
}; 


struct abc 
{ 
  char x : 1; 
  int y : 1; 
  bool z : 1; 
}; 

sizeof(xyz)= 4 sizeof(abc)=12。

VS 2005、64ビットx86マシンを使用しています。

少しのマシン/コンパイラレベルの答えは素晴らしいでしょう。

4

3 に答える 3

5

配置。

コンパイラーは、アーキテクチャーにとって意味のある方法で変数を整列させます。あなたの場合char、、、、はサイズが異なるためintboolビットフィールドのヒントではなく、その情報に基づいて処理されます。

この問題について、この質問でいくつかの議論がありました。

解決策は、#pragmaディレクティブを指定するか__attributes__、コンパイラーにアライメントの最適化を無視するように指示することです。

于 2009-03-10T06:51:42.833 に答える
3

C標準(1999バージョン、§6.7.2.1、102ページ、ポイント10)は、次のように述べています。

実装は、ビットフィールドを保持するのに十分な大きさのアドレス可能なストレージユニットを割り当てることができます。十分なスペースが残っている場合、構造内の別のビットフィールドの直後に続くビットフィールドは、同じユニットの隣接するビットにパックされます。

パッキングがフィールドのタイプによって影響を受けることを可能にする文言はないようです。したがって、これはコンパイラのバグであると結論付けます。

gccは、Linuxの場合、32ビットマシンと64ビットマシンの両方で、どちらの場合も4バイトの構造体を作成します。私はVSを持っておらず、それをテストすることはできません。

于 2009-03-10T07:04:00.323 に答える
0

コンパイラのバグか、何らかのコード エラーです。構造体に割り当てられたすべてのビットは、常に最大のデータ型の sizeof を定義しようとします。たとえば、構造体 xyz では、最大のデータ型のサイズは 4、つまり int です。2 番目の構造体 abc の場合と同様に、int の最大データ型サイズは 4 です。

構造体の変数を次のように変更した場合: struct abc { char a:1; 文字 b:1; ブール c:1; };

sizeof(abc) は 4 ではなく 1 になります。 size の最大データ型は 1 で、すべてのビットが 1 バイトの char に収まるためです。

構造体のデータ型を変更することで、さまざまなテストを実行できます。

古い構造に基づく出力へのリンク: http://codepad.org/6j5z2CEXにアクセスしてください。

私が定義した上記の構造に基づく出力へのリンク: http://codepad.org/fqF9Ob8Wにアクセスしてください。

sizeof 構造体に関するこのような問題を回避するために、#pragma pack マクロを使用して構造体を適切にパックします。

于 2012-04-25T20:10:55.497 に答える