В зависимости от того, как ОС и (возможно) программа реагирует на нехватке памяти, теряя память может сделать программу медленным или неустойчивым. Никаких гарантий.
На современной ОС большой, но в основном неиспользуемый динамический массив int
должен иметь очень мало или вообще не оказывать никакого воздействия. Большая часть неиспользуемой части массива будет только когда-либо назначена виртуальная память, она никогда не будет поддерживаться оперативной памятью или свопом. 64-разрядные операционные системы (которые вы должны использовать, если вы говорите о 32 ГБ ОЗУ) не будут содержать виртуального адресного пространства, пока вы не воспользуетесь этими байтами 2 .
Причина этого заключается в том, чтобы избежать использования класса векторов из-за большого удара производительности в интенсивных приложениях.
Там, вероятно, большой хит производительности для создания vector<int>
больше, чем вам нужно, так как он будет инициализирован в то время как этот массив не инициализирован. Если это то, что вы имеете в виду, тогда ваш код не должен вызывать больше нестабильности, чем огромный вектор, и, возможно, меньше, потому что память никогда не затрагивается.
Если это не так, то не должно быть большого удара производительности от вектора с включенной оптимизацией. Таким образом, вы можете, например, обойти его, используя вектор struct UninitializedInt { int value; UninitializedInt() {} };
, чтобы обеспечить конструкцию по умолчанию no-op. Возможно, вы захотите добавить конструктор int
и/или operator int()
, чтобы облегчить жизнь пользователя (запретите набирать номер .value
повсюду), хотя это приводит к двусмысленным арифметическим операциям, поэтому это не шлейф.
Или, возможно, вы могли бы использовать reserve()
выделить место для вектора, а затем resize()
или push_back()
insert()
или по мере необходимости. Если это закончится тем, что вы действительно проверяете границы или изменяете размер при каждом доступе, вы просто замените один удар производительности другим, конечно.
Ваш код должен работать. Если вам не нужно повторно реализовывать слишком много интерфейса vector
, это может быть самый низкий способ устранения этих служебных издержек инициализации. Конечно, вам нужно убедиться, что вы бесплатно его освободите. Например:
std::unique_ptr<int[]> array_(new int[N]);
Вектор не дает массивного удара производительности – deeiip
Почему бы вам не сравнить свой метод с использованием вектора? – Sash
Ну, это дает, потому что при добавлении нового элемента векторный класс копирует все данные массива в новый массив и затем удаляет старый массив. В некоторых случаях контрольные показатели показывают как минимум 50% -ный удар, 100%. – SkyRipper