私のいくつかのプロジェクトでは、メモリ内の連続したビット シーケンスを効率的に処理する必要性が高まっています (*)。これまでのところ、uint32_t
ビットの取得と設定、値への「or」と「and」の適用、およびコンテナー、ビット単位の長さをバイト単位のサイズまたはコンテナー内の長さに変換するなど... クラスを作成する時期のようです。
C++ 標準ライブラリに の特殊化があることは知っていますがstd::vector<bool>
、これは設計上の欠陥であると多くの人に考えられています。その反復子は実際bool
の s ではなくプロキシ オブジェクトを公開するためです。それが専門化にとって良いアイデアであるか悪いアイデアであるかにかかわらず、それは間違いなく私が検討しているものです-明示的なビットプロキシクラスであり、うまくいけば「常に」最適化されます(constexpr
、noexcept
およびを使用して適切にグリースアップしinline
ます)。std::vector
そこで、標準ライブラリの実装の 1 つからコードを適応させることを考えていました。
一方、私の意図したクラス:
- データ/ビットを所有することはありません - 開始ビット コンテナー アドレス (アライメントを想定) とビット長を受け取り、割り当ても解放もしません。
- std::vector::resize(); のように同じ量のスペースを保持している場合でも、データを動的にまたはその他の方法でサイズ変更することはできません。その長さは、その寿命/スコープ中に固定されます。
- ヒープについて何も知らないはずです(ヒープがない場合に機能します)
この意味では、ビットのスパン クラスに似ています。それでは、スパンから始めますか?わかりませんが、スパンはまだ標準ではありません。スパンにプロキシはありません...
それで、私の実装の良い基礎(編集:基本クラスではない)は何でしょうか?std::vector<bool>
? std::span
? 両方?なし?それとも、車輪の再発明をしているのかもしれませんが、これはすでに解決済みの問題ですか?
ノート:
- ビット シーケンスの長さは、コンパイル時ではなく実行時にわかります。それ以外の場合は、@SomeProgrammerDude が使用できることを示唆しています
std::bitset
。 - 私のクラスは「be-a」スパンまたは「be-a」ベクトルである必要はないので、それらを特殊化することは考えていません。
(*) - これまでのところ、SIMD 効率は高くありませんが、後で実現する可能性があります。また、これは、SIMDize を行わずにレーンが適切なスレッドであると見なす CUDA コードで使用される場合があります。