11

手動で制御されたビットフィールドを持つ多くの構造体を含む C++ アプリケーションがあります。

#define FLAG1   0x0001  
#define FLAG2   0x0002      
#define FLAG3   0x0004      

class MyClass
{
'
'
  unsigned Flags;

  int IsFlag1Set() { return Flags & FLAG1; }
  void SetFlag1Set() { Flags |= FLAG1; }
  void ResetFlag1() { Flags &= 0xffffffff ^ FLAG1; }
'
'
};

明らかな理由から、これを次のようなビット フィールドを使用するように変更したいと思います。

class MyClass
{
'
'
  struct Flags
  {
    unsigned Flag1:1;
    unsigned Flag2:1;
    unsigned Flag3:1;
  };
'
'
};

この切り替えに関して私が懸念しているのは、このサイトで、C++ のビット フィールドがいかに遅いかを述べている多くの参考文献に出くわしたことです。私の推測では、上記の手動コードよりもまだ高速ですが、さまざまなプラットフォーム、特に 32 ビットおよび 64 ビット ウィンドウでビット フィールドを使用することによる速度への影響をカバーするハード リファレンス資料はありますか。アプリケーションはメモリ内の膨大な量のデータを処理し、高速でメモリ効率が高い必要があります。これが、最初にこのように記述された理由である可能性があります。

4

3 に答える 3

6

どちらの場合も、コンパイラは最終的にビットマスキングに対してほぼ同じ命令を発行する必要があるため、2 つの例の速度は非常に似ているはずです。どちらが本当に最適かを知るには、いくつかの簡単な実験を行ってください。しかし、結果が決定的でなくても驚かないでください。それは私が予測していることです...

ただし、ビットフィールドは型であると言ったほうがよいかもしれませんbool

于 2010-04-14T14:15:46.597 に答える
5

これが非常に非常にタイトなループでない限り、パフォーマンスに関して 2 つのどちらかを選択する必要はありません。パフォーマンスが本当に重要な場合は、bool (つまり、おそらく 32 ビット値) を使用します。

このような単一ビット フィールドが 3 つしかない構造体を使用しても、少なくとも32 ビットにパディングされます。可能な限りすべてを節約することに集中している場合は、構造体のアライメントとパディングに関するコンパイラのドキュメントを参照してください。

編集: ただし、ビットフィールドを好む理由の 1 つは、ビットフィールドの方がコードがきれいになるためであり、保守性の重要性を過小評価してはなりません。プログラマーの時間に比べて、コンピューターの時間は安い!

于 2010-04-14T14:16:11.820 に答える
2

この種の質問に対する一般的なアドバイス: 状況 (操作、ハードウェアなど) をできるだけ正確に比較する簡単なプログラムをセットアップし、パフォーマンスの違いを自分で測定してください。

ビットフィールドとマスキングに関するこの質問については、パフォーマンスに大きな違いがあるとは思えません。ビットフィールド コードは、コンパイラによっては、マスキングよりも 1 つまたは 2 つ多いシフトが必要になる場合があります。それがあなたのアプリケーションで目立つかどうかは、あなたが答える必要があるものです. たとえば、マスク プログラマブルな組み込みコードとデスクトップ アプリケーションでは、考慮事項に大きな違いがあります。

于 2010-04-14T14:28:11.787 に答える