В стандарте C ++ в [basi c .stc] говорится следующее:
2 Stati c, thread и automati c продолжительность хранения связана с объектами, введенными декларациями (6.1) и неявно созданными реализацией (6.6.7).
Эта 6.6.7 ссылка относится к [class. Contemporary] , посвященный временным. Временные объекты - это не совсем то же самое, но в этом разделе говорится следующее:
2 Материализация временного объекта обычно откладывается на максимально возможный срок, чтобы избежать создания ненужных временных объектов.
Я не нашел ничего, что могло бы ответить на ваш вопрос, поэтому стандарт, похоже, дает реализации некоторую свободу действий относительно того, когда для объекта выделяется память.
Обратите внимание, что это действительно так. не применяется, когда объект инициализируется - это происходит, когда выполняется оператор объявления, согласно [stmt.dcl] :
2 Переменные с автоматическим c продолжительностью хранения (6.6.5.3) инициализируются каждый раз, когда выполняется их объявление-оператор . Переменные с автоматической c продолжительностью хранения, объявленной в блоке, уничтожаются при выходе из блока (8.6).
Ссылка cppreference , которую вы упомянули, вероятно, обсуждает типичную реализацию, где объекты с автоматическим c сроком хранения размещаются в стеке. В таких реализациях имеет смысл выделять память в начале охватывающего блока (в конце концов, это всего лишь простое (в / де) создание указателя стека, и их группировка полезна).
Если вы хотите избежать выделения памяти для огромного объекта, когда он не нужен, реструктуризация кода - это вариант. В некоторых реализациях введение дополнительной области блока приведет к следующему:
{
if(somecondition1) throw something;
{
MyHugeObject o{};
/// do something
}
}
В других реализациях могут потребоваться другие подходы. Комментарий @ DanielLangr ниже указывает на реализации, в которых распределение происходит в начале включающей функции, а не в начале блока.