Прежде всего, я заметил, что когда я malloc памяти и calloc, объем памяти отличается. Я работаю с наборами данных в несколько ГБ. Это нормально, если эти данные случайные.
Я ожидал, что смогу просто распределить большой объем памяти и прочитать все случайные данные, которые были в ней, переданы в float. Однако, глядя на объем памяти в средстве просмотра процесса, память явно не востребована (в отличие от calloc, где я вижу большой отпечаток). Я запустил цикл для записи данных в память, а затем увидел, что объем памяти увеличивается. Правильно ли я сказал, что память фактически не востребована, пока я ее не инициализирую?
Наконец, после того, как я пропустил 1024 *1024* 128 байт (1024 МБ в средстве просмотра процесса), я начал получать ошибки сегмента. Однако Calloc, похоже, инициализирует полный объем до 1 ГБ. Почему при инициализации памяти в цикле for с malloc с этим значением 128 МБ возникают ошибки segfaults и почему объем памяти составляет 1024 МБ?
Если malloc большое количество из памяти, а затем прочитать из него, что я получаю (так как средство просмотра процесса не показывает почти никакого места, пока я не инициализирую его)?
Наконец, есть ли способ выделить для меня более 4 ГБ? Я тестирую производительность иерархии памяти.
Код для № 2:
long long int i;
long long int *test=(long long int*)malloc(1024*1024*1024);
for (i=0;i<1024*1024*128;i++)
test[i]=i;
sleep(15);