16

ビットセット (STL コンテナー) を使用して一連のフラグを管理する方が、複数の個別の (bool) 変数として宣言するのではなく、どのような状況でより適切でしょうか?

50 個の個別の bool 変数を使用するのではなく、50 個のフラグにビットセットを使用すると、パフォーマンスが大幅に向上しますか?

4

4 に答える 4

10

ビットセットとしての 50 ブールは 7 バイト、ブールとしての 50 ブールは 50 バイトを要します。最近は大したことではないので、bool を使用することはおそらく問題ありません。

ただし、ビットセットが役立つ可能性のある場所の 1 つは、これらのブール値を頻繁に渡す必要がある場合、特に関数からセットを返す必要がある場合です。ビットセットを使用すると、リターンのためにスタック上で移動する必要があるデータが少なくなります。繰り返しになりますが、代わりに refs を使用するだけで、渡すデータがさらに少なくなります。:)

于 2008-08-21T19:05:30.763 に答える
9

std::bitset は、シリアル化/逆シリアル化が必要な場合に追加のポイントを提供します。ストリームに書き込むか、ストリームから読み取ることができます。しかし、確かに、個別の bool の方が高速になります。結局のところ、これらはこの種の使用に最適化されていますが、ビットセットはスペース用に最適化されており、関数呼び出しがまだ含まれています。個別のブールよりも高速になることはありません。

ビットセット

  • 非常にスペース効率が良い
  • ビットいじりによる効率の低下
  • op<<およびを使用したシリアライズ/デシリアライズを提供しますop>>
  • すべてのビットがまとめられています: フラグが 1 か所に配置されます。

個別のブール値

  • とても早い
  • Bool は一緒にパックされません。彼らはどこかのメンバーになります。

事実を判断してください。私は、個人的には、std::bitsetパフォーマンスが重要ではない場合に使用し、ブールが数個しかない場合 (したがって、概観できる場合)、または追加のパフォーマンスが必要な場合にブールを使用します。

于 2008-11-19T04:32:19.037 に答える
4

「パフォーマンスの向上」の意味によって異なります。それらが 50 個しか必要なく、メモリが不足していない場合は、ほとんどの場合、個別のブール値がビットセットよりも優れた選択です。それらはより多くのメモリを必要としますが、ブールははるかに高速になります。通常、ビットセットは int の配列として実装されます (bool はこれらの int にパックされます)。したがって、ビットセットの最初の 32 個の bool (ビット) は 1 つの 32 ビット int しか占有しませんが、各値を読み取るには、最初にビットごとの操作を実行して、不要な値をすべてマスクする必要があります。たとえば、ビットセットの 2 番目のビットを読み取るには、次のようにする必要があります。

  1. 必要なビットを含む int を見つけます (この場合、最初の int です)
  2. Bitwise そして、そのビットが設定されているかどうかを調べるために、「2」(つまり、値と 0x02) を含むその int

ただし、メモリがボトルネックであり、ビットセットを使用する bool がたくさんある場合は、理にかなっている可能性があります (たとえば、ターゲット プラットフォームが携帯電話である場合、または非常にビジーな Web サービスの状態である場合)。

注: 通常、 bool の std::vector には、 bitset と同等のものを使用するための特殊化があるため、同じ理由で、はるかに小さくなり、遅くなります。したがって、速度が問題になる場合は、char (または int) のベクトルを使用するか、古い学校の bool 配列を使用することをお勧めします。

于 2008-08-21T19:21:03.240 に答える
3

RE @ウィルカ:

実際、ビットセットは C/C++ でサポートされており、独自のマスキングを行う必要はありません。正確な構文は覚えていませんが、次のようなものです。

struct MyBitset {
  bool firstOption:1;
  bool secondOption:1;
  bool thirdOption:1;
  int fourBitNumber:4;
};

ドット表記を使用するだけで、その構造体の任意の値を参照でき、正しいことが起こります。

MyBitset bits;
bits.firstOption = true;
bits.fourBitNumber = 2;

if(bits.thirdOption) {
  // Whatever!
}

物事には任意のビットサイズを使用できます。結果の構造体は、定義したデータより最大 7 ビット大きくなる可能性があります (そのサイズは常に、定義したデータを格納するために必要な最小バイト数です)。

于 2008-08-21T19:35:54.827 に答える