私はC++で非常に大きなブール値のリストを処理していますが、それぞれNブール値の2^N個のアイテムがあります。このような状況、すなわち指数関数的な成長ではメモリが重要であるため、各要素を格納するためにNビットのlong変数を作成したいと考えています。C++でNビットの変数を作成するには?
小さいNの場合、たとえば24の場合は、ただunsigned long int
を使用しています。 64MB((2^24)* 32/8/1024/1024)必要です。しかし、私は36まで上がる必要があります。変数を組み込む唯一のオプションはunsigned long long int
ですが、512GB((2^36)* 64/8/1024/1024/1024)が必要です。 36ビットの変数を使用すると、私のスーパーコンピュータのノードに適合する288GB((2^36)* 36/8/1024/1024/1024)にサイズが下がるため、私にとってはうまくいくでしょう。
std::bitset
を試しましたが、std::bitset<N>
は少なくとも8Bの要素を作成します。 std::bitset<1>
のリストはunsigned long int
のリストよりはるかに大きいです。 std::bitset
はコンテナではなく表現を変更するだけです。
また、私はブーストからboost::dynamic_bitset<>
を試しましたが、同じ理由で結果がさらに悪い(少なくとも32B!)。
Iオプションは、次に、(38654705664 * 8分の64 288ギガバイトを与える38654705664(64分の2473901162496)unsigned long long int
に次に格納する、ブール値のいずれかの鎖、2473901162496(* 36 2^36)のように全ての要素を記述するために知っています/ 1024/1024/1024)。次に、要素にアクセスするには、36ビットがどの要素に格納されているかを見つけるゲーム(1つでも2つでもよい)です。しかし、既存のコード(3000行)の書き換えが多いため、マッピングが不可能になり、実行中に項目を追加したり削除したりすることは、複雑で紛らわしく、困難になり、その結果が効率的でない可能性が高いからです。
C++でNビット変数を作成するにはどうすればよいですか?
':: std :: vector'についてはどうですか?大量のビットを格納する必要がある場合は、適切な選択です。 –
VTT
size_of_bits_needed/sizeof(uint8_t)の 'std :: array'や 'std :: vector 'を使うのはどうですか? –
'unsigned long long'のシーケンスではなく、なぜ単一の' dynamic_bitset'ですか?要素Xを見つけることは、N * Xビットを入力するのと同じくらい簡単になります。それは、最小限のスペースでありながら、ロジックの使用を簡略化します(そしてその上で抽象化することができます)。欠けている主なものは、後ろにない挿入/削除です。 – chris