1

ブール値の効率的な使用についてコメントできるコンパイラの専門家はいますか? 具体的には、コンパイラはstd::vector<boolean>最小限のメモリを使用するように最適化できますか? 同等のデータ構造はありますか?

昔は、ブール値の配列を圧縮して、ブール値ごとにわずか 1 ビットの表現にできるコンパイラを備えた言語がありました。おそらく、C++ で実行できる最善の方法は、std::vector<char>メモリ使用量を最小限に抑えるためにブール値を格納するために使用することでしょうか?

ここでの使用例は、数億のブール値を保存することです。1 バイトは、値ごとに 4 バイト以上、1 ビット以上の多くのスペースを節約します。

4

5 に答える 5

5

見るstd::vector

専門分野

標準ライブラリは、スペース効率のために最適化された bool 型の std::vector の特殊化を提供します。
vector<bool> スペース効率の高い動的ビットセット (クラス テンプレートの特殊化)

および「ワーキング ドラフト C++、2012 年 11 月 2 日」から

23.3.7 クラス vector [vector.bool]
1 スペース割り当てを最適化するために、bool 要素用の vector の特殊化が提供されています:
template <class Allocator> class vector<bool, Allocator> {
...
}

3 データが bool 値の連続した割り当てとして格納される必要はありません。代わりに、スペースが最適化されたビットの表現が推奨されます。

boolそのため、値をビットとして格納する必要はありませんが、推奨のみです。

于 2013-02-28T03:31:05.910 に答える
1

vector<bool>これはコンテナではありませんが、コンテナのふりをしてイテレータを提供することに注意してください。要素のアドレスを取得しようとするなど、通常のコンテナーのように扱うと、ある日、混乱とエラーが発生する可能性があります。

ブール値ごとに 1 ビットを格納する必要がある場合は、 boost::dynamic_bitsetを検討std::bitsetするか、 boost::dynamic_bitset を使用できます。これらのデータ構造はコンテナーのふりをしないため、特にテンプレート コードでそれらを使用するときにエラーが発生する可能性はほとんどありません。

于 2013-02-28T03:50:03.643 に答える
1

std::vector for bool は、あなたが求めていることを行うテンプレートの特殊化です。

詳しくはこちらをご覧ください

また、標準のbitsetを調べることもできます。

于 2013-02-28T03:29:19.870 に答える
0

Bitvector効率的なストレージを保証する標準にとらわれない方法として、独自のクラスを作成できます。基本的に、8 つの値ごとに 1 つのbool値を割り当てるだけでよく、それぞれを 1 つのビットにchar格納できます。bool次に、アクセサー/ミューテーターでビットシフト手法を使用して、個々のビットを保存/取得できます。

そのような例の 1 つが、Ron Penton と André LaMothe のData Structures for Game Programmersで概説されています (一般的なデータ構造のリファレンスとしてもお勧めします)。とはいえ、自分で書くのはさほど難しいことではありません。詳しく調べたわけではありませんが、おそらくインターネット上にはさらにいくつかの例があります。

于 2013-02-28T03:38:26.550 に答える
0

標準の欠陥であると広く考えられているstd::vectorboolは、各値を表すために単一のビットを使用するように特化されています。

それがあなたが探しているものである場合は、それを使用してください。

于 2013-02-28T03:29:48.140 に答える