ビットセット (STL コンテナー) を使用して一連のフラグを管理する方が、複数の個別の (bool) 変数として宣言するのではなく、どのような状況でより適切でしょうか?
50 個の個別の bool 変数を使用するのではなく、50 個のフラグにビットセットを使用すると、パフォーマンスが大幅に向上しますか?
ビットセット (STL コンテナー) を使用して一連のフラグを管理する方が、複数の個別の (bool) 変数として宣言するのではなく、どのような状況でより適切でしょうか?
50 個の個別の bool 変数を使用するのではなく、50 個のフラグにビットセットを使用すると、パフォーマンスが大幅に向上しますか?
ビットセットとしての 50 ブールは 7 バイト、ブールとしての 50 ブールは 50 バイトを要します。最近は大したことではないので、bool を使用することはおそらく問題ありません。
ただし、ビットセットが役立つ可能性のある場所の 1 つは、これらのブール値を頻繁に渡す必要がある場合、特に関数からセットを返す必要がある場合です。ビットセットを使用すると、リターンのためにスタック上で移動する必要があるデータが少なくなります。繰り返しになりますが、代わりに refs を使用するだけで、渡すデータがさらに少なくなります。:)
std::bitset は、シリアル化/逆シリアル化が必要な場合に追加のポイントを提供します。ストリームに書き込むか、ストリームから読み取ることができます。しかし、確かに、個別の bool の方が高速になります。結局のところ、これらはこの種の使用に最適化されていますが、ビットセットはスペース用に最適化されており、関数呼び出しがまだ含まれています。個別のブールよりも高速になることはありません。
op<<
およびを使用したシリアライズ/デシリアライズを提供しますop>>
事実を判断してください。私は、個人的には、std::bitset
パフォーマンスが重要ではない場合に使用し、ブールが数個しかない場合 (したがって、概観できる場合)、または追加のパフォーマンスが必要な場合にブールを使用します。
「パフォーマンスの向上」の意味によって異なります。それらが 50 個しか必要なく、メモリが不足していない場合は、ほとんどの場合、個別のブール値がビットセットよりも優れた選択です。それらはより多くのメモリを必要としますが、ブールははるかに高速になります。通常、ビットセットは int の配列として実装されます (bool はこれらの int にパックされます)。したがって、ビットセットの最初の 32 個の bool (ビット) は 1 つの 32 ビット int しか占有しませんが、各値を読み取るには、最初にビットごとの操作を実行して、不要な値をすべてマスクする必要があります。たとえば、ビットセットの 2 番目のビットを読み取るには、次のようにする必要があります。
ただし、メモリがボトルネックであり、ビットセットを使用する bool がたくさんある場合は、理にかなっている可能性があります (たとえば、ターゲット プラットフォームが携帯電話である場合、または非常にビジーな Web サービスの状態である場合)。
注: 通常、 bool の std::vector には、 bitset と同等のものを使用するための特殊化があるため、同じ理由で、はるかに小さくなり、遅くなります。したがって、速度が問題になる場合は、char (または int) のベクトルを使用するか、古い学校の bool 配列を使用することをお勧めします。
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 ビット大きくなる可能性があります (そのサイズは常に、定義したデータを格納するために必要な最小バイト数です)。