Это не вызвано использованием reserve()
или resize()
. Это вызвано тем, что операционная система вашего хоста выполняет ленивое распределение.
Первым шагом является то, что operator new()
(используется распределителем по умолчанию vector
) запрашивает много памяти у ОС. ОС указывает вашей программе, что она выполнила выделение (например, вернув действительный дескриптор для памяти в operator new()
, который, в свою очередь, возвращает действительный указатель на вашу программу), но на самом деле НЕ выделяет память.
Впоследствии, когда ваша программа делает что-то, что зависит от выделяемой памяти, ОС ловит неизбежный сигнал от аппаратного блока управления памятью (например, как сбой страницы) и затем выделяет страницу. Это происходит при использовании вами vector
s push_back()
.
Некоторые операционные системы намеренно делают это или могут быть настроены так, чтобы избежать чрезмерного выделения памяти. Надежда такого подхода состоит в том, что большой объем памяти может быть запрошен, но фактически никогда не используется программой. Причина заключается в том, что большие выделения могут повлиять на производительность всей системы (например, замедлить работу операционной системы, вызвать замену других программ и т. Д.).
Одним из следствий этого является то, что выделение может - насколько это касается вашей программы - успешно, но более позднее использование этой выделенной памяти может завершиться неудачно (например, вызов push_back()
после использования reserve()
может завершиться неудачей).