1

У меня есть 32 ГБ ОЗУ в моей системе и вы хотите читать и хранить файл объемом 15 ГБ в памяти. Когда я попытался выполнить следующий код, выход был: «n read = 1073741824», что соответствует точно 1 ГБ, тогда как он должен был читать байты, соответствующие размеру файла.malloc не выделяет указанную память (64 бит)

Я проверил даже запуск диспетчера системных ресурсов и увеличился ровно на 1 ГБ, а это значит, что malloc не выделил 17 ГБ пространства, как ожидалось.

С 64-разрядной системой я мог бы читать до 8 ТБ (с 32-разрядной системой - 2 ГБ или более конкретным 1,5 ГБ).

Я на 64-битной машине и ОС, и я уже сконфигурировал Visual C++ для сборки и выполнения 64-битных двоичных файлов, выполнив следующие шаги: Intel Link [Проверено, что это 64 бита, проверяя размер int-ранее это было 4 байта, теперь это 8 байт]

Что я могу настроить, чтобы выделить и использовать память размером более 1 ГБ?

#include <stdio.h> 
#include <cstdlib> 

#define PATH "C:\\train" 
#define SIZE 17*1024*1024*1024 

int main() 
{ 
     FILE * fp = fopen(PATH, "r"); 
    char* buff = (char*)malloc(SIZE); 
    int nRead = fread(buff, 1, SIZE, fp); 
    buff[nRead] = 0; 
    printf("n read = %d\n", nRead); 

    int a; 
    scanf("%d" ,&a); 
    return 0; 
} 
+1

'SIZE' является' 'int' и int' еще 4 байта на 64-битной Windows. Вы не можете поместить его в int. – Simple

ответ

6

Проблема заключается в том, что 17*1024*1024*1024 является буквальным типа int и int четыре байта в ширину на Windows. Вы совершенно ошибаетесь в своем убеждении, что int имеет ширину 8 байтов в 64-битной Windows. Это не. Он имеет ширину 4 байта. Очевидно, что целое число в 4 байта не может удерживать значение, которое вы хотите поместить в него.

Вы должны использовать 64 битное целое число буквальное:

17*1024*1024*1024ull 
+0

О да, размер int еще 4 байта. Причина, по которой я думал, что она стала 8 байтами, - я фактически проверил размер указателя, используя sizeof (buff), и теперь я понимаю, что размер указателя должен был увеличиться, чтобы иметь возможность адресовать эту большую память. не то же самое, что и int. –

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