C++ 'da çok fazla boole listesiyle uğraşıyorum, her biri yaklaşık 2^N N booleans ürün. Bellek, bu durumda, yani üstel bir büyüme açısından kritik olduğu için, her bir öğeyi depolamak için bir N-bit uzun değişkeni oluşturmak isterim.C++'da N bit değişkenleri nasıl oluşturulur?
Küçük N için, örneğin 24, sadece unsigned long int
kullanıyorum. 64MB ((2^24) * 32/8/1024/1024) alır. Fakat 36'ya kadar çıkmam gerekiyor. Yapılandırma değişkenine sahip tek seçenek unsigned long long int
'dur, ancak 512GB ((2^36) * 64/8/1024/1024/1024) alır, bu da biraz fazladır. 36 bitlik bir değişkenle, benim için çalışacaktır çünkü boyut, süper bilgisayarımın bir düğümündeki 288 GB ((2^36) * 36/8/1024/1024/1024) değerine düşer.
std::bitset
'u denedim, ancak std::bitset<N>
en az 8B'lik bir öğe oluşturur. std::bitset<1>
'un bir listesi, unsigned long int
listesinden çok daha büyüktür. Bunun nedeni, std::bitset
'un yalnızca kapsayıcı değil, gösterimi değiştirmesidir.
Ayrıca Boost'dan boost::dynamic_bitset<>
'u denedim, ancak aynı nedenden dolayı sonuç en kötüsüdür (en az 32B!).
Bir seçenek daha sonra (38654705664 * 64/8 288GB verir 38654705664 (2473901162496/64) unsigned long long int
, daha sonra kaydetmek için, Boolean bir zincir, 2473901162496 (* 36 2^36) tüm elemanları yazma olduğunu biliyoruz/1024/1024/1024). Daha sonra bir öğeye erişmek için, 36 bitin hangi öğelerde saklandığını bulmak mümkündür (bir veya iki olabilir). Ancak, mevcut kodun (3000 satır) yeniden yazılması çok fazladır çünkü haritalama imkansız hale gelir ve bazı işlevlerde yürütme sırasında öğelerin eklenmesi ve silinmesi kesinlikle karmaşık, karmaşık ve zorlayıcı olacaktır ve sonuç büyük olasılıkla verimli olmayacaktır.
C++'da N-bit değişkeni nasıl oluşturulur?
? Çok miktarda bit depolamanız gerekiyorsa iyi bir seçimdir. – VTT
Bir "std :: array" veya "std :: vector " boyutunun sadece number_of_bits_needed/sizeof (uint8_t) boyutu nasıl kullanılır? –
"İmzasız uzun uzun" dizisinden ziyade, neden tek bir "dynamic_bitset" değil? Daha sonra X elemanının bulunması, N * X bitlerinin içine girmesi kadar basit hale gelir. Bu, onu kullanmanın mantığını sadeleştirir (ve bununla ilgili olarak özetleyebilirsiniz). Eksik olan ana şey, arkada olmayan ekleme/silme işlemidir. – chris