Да, рекомендуется делать большие выделения динамически - потому что тогда вы сможете изящно справиться с неудачей ( обязательное примечание по терминологии ).
Например, это:
void might_throw(size_t sz) {
std::vector<int> v(sz);
// ...
}
выдаст std::bad_alloc
, если произойдет сбой при достаточно большом sz
, что означает, что у меня есть возможность перехватить исключение и повторить попытку с меньшим числом.Даже если мне не удастся восстановить, разматывание стека позволяет безопасно очищать мои другие объекты.
И наоборот
void will_just_die() {
int a[SomeEnormousConstant];
// ...
}
не имеет механизма восстановления, если a
не может быть на самом делесоздано.Программа просто аварийно завершит работу, без разматывания стека или (стандартного) механизма обработки ошибок.
Это может произойти немедленно, или это может произойти, только если вы действительно попытаетесь получить доступ к большему количествуa
чем можно было бы успешно выделить.Если вам очень не повезло, он может даже работать , но что-то сломать.
Детали того, как данное распределение отображается внешне, очень зависят от ОС, и яя не уверен, что вы используете - является ли диспетчер приложений OSX?
Обычно для большого динамического выделения отображается прямое сопоставление, и в этом случае оно мгновенно отображается как увеличение виртуального размера,но все равно не может быть выделено никаких физических страниц, кроме как при доступе.
Если автоматическое ("стек") просто выполняет арифметику с указателем фрейма и снова полагается на ленивое распределение физических страниц, это не повлияетлибо виртуальный, либо физический размер (опять же, пока вы не попытаетесь реально получить доступ к этой памяти).
Я не знаю, почему запуск автоматической версии займет больше времени - вам нужно будет предоставить MCVE , для которого это было фактически воспроизводимо, а также сведения о вашей ОС / платформе, чтобы получить ответ на этот вопрос.