C ++ Программа, которая приближает размер свободного хранилища (кучи) - PullRequest
3 голосов
/ 02 декабря 2011

Я должен написать программу, которая не дает сбоя и может приблизиться к размеру свободного хранилища (кучи памяти). И намек

Hint:  Use a loop to allocate, say, 1000000 bytes at a time and 
add 1 to an unsigned long long counter; then when the allocation fails, print
the counter times 1000000.0.

Это мое первое знакомство с программированием и с ++, так что я полностью потерян для начала. Разве размер свободного магазина не зависит от оперативной памяти компьютера? Как я могу рассчитать размер этой большой памяти в байтах?

Кроме того, что такое длинная без знака?

Ответы [ 3 ]

4 голосов
/ 02 декабря 2011

Измерение ОЗУ путем последовательного распределения блоков до тех пор, пока не произойдет сбой распределения, безусловно, является одним из подходов, но это не то, как профессиональный программист решит проблему.Это равносильно определению размера файла путем считывания всего файла и подсчета байтов один за другим (вместо них следует использовать stat(), fstat() или fseek() и ftell()).

Гораздо лучший подход - спросить у операционной системы, сколько памяти доступно.В конце концов, он определенно знает ответ на этот вопрос.

В Linux вы бы использовали sysinfo() API.Прочитайте this для примера.

В Windows вы должны использовать GetPhysicallyInstalledSystemMemory().Прочитайте об этом здесь .

В MacOS вы должны использовать sysctl() API с селекторами CTL_HW и HW_MEMSIZE.

Это ТАКНа странице приведены подробные примеры для трех основных платформ.

Еще одна вещь: в системах с виртуальной памятью свободное хранилище, которое вы пытаетесь измерить, может быть ближе к размеру системного файла подкачки надиска, чем объем установленной физической ОЗУ, и состояние других процессов в системе также будет влиять на значение, измеренное последовательным выделением.

1 голос
/ 02 декабря 2011

Длинный без знака long - целое число 64 бита.Он может представлять любое целое число в диапазоне [0,2 ^ 64].

Ваша программа не может использовать всю вашу оперативную память.ОС ограничивает общий объем памяти, доступный для любой программы.

Исходный код:

char *heap;

unsigned long long heap_cont = 1;

while(1)
{
   //allocating the memory. Malloc returns a NULL pointer when fails.
   heap = (char *)malloc(sizeof(char)*heap_cont*1000000);
   if(heap == NULL)
   break;

   free(heap);
   heap_cont++;
}

std::cout << "Heap count: " << heap_cont * 1000000";
0 голосов
/ 02 декабря 2011

Это хороший вопрос C ++. Решение простое, но требует приличного понимания циклов, распределения памяти, проверки ошибок, вывода на консоль и целочисленных типов данных. Не расстраивайтесь - если это действительно ваше первое знакомство с программированием , то это безумие, когда кто-то ожидает, что вы ответите на этот вопрос.

Подсказка дает вам все необходимое. Я разобью его на этапы, и вы скажете нам, какая часть доставляет вам неприятности.

  • Use a loop
  • allocate, say, 1000000 bytes
  • add 1 to an unsigned long long counter
  • выяснить when the allocation fails без сбоев
  • print the counter times 1000000.0

Разве размер свободного магазина не зависит от оперативной памяти компьютера?

Да. Это также зависит от других программ, запущенных на компьютере в данный момент.

Как я могу вычислить размер этой большой памяти в байтах?

Компьютер должен знать размер своей собственной памяти для правильной работы. Где-то информация существует или может быть рассчитана.

Что такое длинный без знака?

В C ++ 11 он гарантированно равен как минимум 64 битам. До C ++ 11 это целочисленный тип данных без знака, по крайней мере такой же большой, как unsigned long.

...