Это в C ++ на CentOS 64bit с использованием G ++ 4.1.2.
Мы пишем тестовое приложение для загрузки памяти в системе n гигабайт. Идея состоит в том, что общая нагрузка системы контролируется через SNMP и т. Д. Так что это всего лишь способ осуществления мониторинга.
Однако мы видели, что просто делаем:
char* p = new char[1000000000];
не влияет на используемую память, как показано в верхней или свободной -m
Распределение памяти кажется «реальным» только после записи в память:
memcpy(p, 'a', 1000000000); //shows an increase in mem usage of 1GB
Но мы должны записать всю память, просто запись в первый элемент не показывает увеличение используемой памяти:
p[0] = 'a'; //does not show an increase of 1GB.
Это нормально, память фактически полностью выделена? Я не уверен, что инструменты, которые мы используем (top и free -m), отображают неверные значения или что-то умное происходит в компиляторе или во время выполнения и / или в ядре.
Такое поведение наблюдается даже в отладочной сборке с отключенными оптимизациями.
Насколько я понял, новый [] сразу же выделил память. Задерживает ли среда выполнения C ++ это фактическое распределение до тех пор, пока к нему не будет получен доступ. В таком случае может ли исключение нехватки памяти быть отложено до тех пор, пока не будет фактически выполнено выделение памяти до тех пор, пока не будет осуществлен доступ к памяти?
Так как это не проблема для нас, но было бы неплохо узнать, почему это происходит именно так!
Ура!
Edit:
Я не хочу знать о том, как мы должны использовать Векторы, это не OO / C ++ / текущий способ работы и т. Д. И т. Д. Я просто хочу знать, почему это происходит именно так чем есть предложения для альтернативных способов попробовать это.