2013-09-05 2 views
0

Я хотел бы выделить память, чтобы читать (целые) очень большие файлы (15-25 Gb) в моей программе на C++. Я использовал off64_t, чтобы получить начальную и конечную позиции файла, который я хочу прочитать, которые получены из моего файла, используя функцию ftello64. Теперь я хотел бы получить разницу между ними в переменной с именем size и затем распределить ее по массиву char. Однако, несмотря на успешную компиляцию, мой код работает неправильно. Я попытался size = (off64_t)(end_of_mem-start_of_mem); где start_of_mem и end_of_mem оба off64_t номера, но когда я запускаю свою программу, выходРассчитать разницу между двумя значениями off64_t C++

Starting position in memory (start_of_mem):152757 
Ending position in memory (end_of_mem):15808475159 
Size: -1371546782 

Какой вариант я должен использовать, чтобы получить это право? Заранее благодарим за помощь и предложения.

+2

Это очень малопонятно, что вы можете получить 15 ГБ свободной кучи. Вы должны искать файлы с отображением памяти в своей ОС. – sbabbi

+0

Пожалуйста, покажите небольшой, компилирующий код, в котором есть проблема. –

+1

Вам нужно показать тип данных для 'size' и как вы показываете значения –

ответ

2

Вы испытываете перетаскивание в нижнем диапазоне от 64 до 32 бит.

Взгляните на следующий эксперимент:

#include <cstdint> 
#include <iostream> 
int main(){ 
    int64_t int64 = 15808475159 - 152757; 
    int32_t int32 = int64; 

    std::cout << "int64_t: " << int64 << "\n"; 
    std::cout << "int32_t: " << int32 << "\n"; 
} 

Выход:

int64_t: 15808322402 
int32_t: -1371546782 

Проблема является результатом 15808475159 - 152757 больше, чем диапазон от 32-разрядного целого числа. Таким образом, из-за переполнения он усекается (или mod 2^32). Тогда, поскольку он объявлен как подписанный 32-битный, он, очевидно, попадает в отрицательный диапазон интерпретации.

+0

Спасибо за все комментарии и за ответ! – loukdelouk

+0

Как и другие комментарии, я не уверен, что вы можете получить 25 ГБ памяти, выделенную в одном куске, и в конечном итоге решит вашу проблему. Но это, безусловно, объясняет, почему вы наблюдаете за тем, кем вы являетесь. – luk32

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