2013-07-13 4 views
2

Для некоторого кода на C++ моя логика требует булевского массива, содержащего 4 * 10^10 индексов. Я использую контейнер STL std::bitset. Но его реализация как template < size_t N > class bitset; ограничивает количество бит до верхнего предела типа данных size_t (без знакового типа), который равен 2^32-1 (или 2^64-1) {Может ли кто-то подтвердить это также} ,Очень длинный булевский массив/std :: bitset

Я думал об обходном пути для этой проблемы, создав array of bitset, как в bitset<100000000> checkSum[400];

Это законный? Я получаю следующее сообщение об ошибке компиляции (test.cpp мой C++ файл)

/tmp/cc0gR0c6.o: In function `__static_initialization_and_destruction_0(int, int)': 
test.cpp:(.text+0x35f): relocation truncated to fit: R_X86_64_32 against `.bss' 
test.cpp:(.text+0x373): relocation truncated to fit: R_X86_64_32 against `.bss' 
collect2: ld returned 1 exit status 

Может ли это каким-то образом быть фиксированной или есть лучше решить эту проблему?

+0

Этот массив нуждается в большем количестве, чем 4 ГБ статических данных. Если вы работаете в Windows, я думаю, вы можете получить не более 2 ГБ памяти. Попробуйте распределить его динамически (даже если это не будет работать, если вы на 32-битной системе). – jrok

+0

@jrok Да, кажется, вы правы. Невозможно выделить 4 ГБ памяти. Будет работать над лучшей логикой, чтобы избежать этого. – Shobhit

+0

Если это головоломка для соревнований или программирования, проблема, вероятно, основана на блокировании наивного решения, сделав данные 10 раз большими, чтобы поместиться в память в тестовой системе. – Yakk

ответ

0

size_t - это 32 или 64 бита, в зависимости от того, компилируете ли вы 32 или 64-битный код. Похоже, вы можете просто скомпилировать 64-битную цель и решить эту проблему.

+0

Моя машина 64 бит, а 'bitset <3*10^10>' работает отлично, но 'bitset <4*10^10>' дает ту же ошибку компиляции, что и в вопросе. Кроме того, я думаю, что онлайн-судья, которому я представляю свой код, 32 бит; поэтому требуется обходное решение. – Shobhit

1

Я думаю, вы должны использовать вектор вместо массива, так же, как:

vector<bitset<1000000> > checkSum; 
+0

'std :: vector > checkSum (400, bitset ());' отлично работает. Но учтите, что он выделяет только 4 * 10^9. 'std :: vector > checkSum (4000, bitset ());' приводит к ошибке выполнения; завершение вызова после вызова экземпляра 'std :: bad_alloc' what(): std :: bad_alloc Aborted (core dumped) ' – Shobhit

+0

Я думаю, что памяти недостаточно, 10^7 бит нуждаются в 1M памяти, 4000 * 10^7 почти нуждаются в 4G, может быть, вам не хватает памяти! – minicaptain

Смежные вопросы