Что касается оптимизации компилятора, допустимо и / или возможно ли изменить выделение кучи на выделение стека? Или это нарушит правило «как если бы»?
Например, предположим, что это исходная версия кода.
{
Foo* f = new Foo();
f->do_something();
delete f;
}
Сможет ли компилятор изменить это на следующее
{
Foo f{};
f.do_something();
}
Я бы так не подумал, потому что это имело бы последствия, если бы исходная версия полагалась на такие вещи, как настраиваемые распределители. В стандарте что-то конкретно говорится об этом?
f
даже не будет выделен вообще, потому что его элементы данных в конечном итоге окажутся в регистрах или полностью оптимизированы. В этом случае у динамического выделения нет никаких преимуществ, за исключением очевидного факта, что запрошенное выделение кучи никогда не выполнялось. Можно было бы разумно спросить, сможет ли компилятор затем устранить это. - person user4815162342   schedule 02.11.2017expr.new
и не видел ограничений относительно того, бросает лиdo_something
. Вы видите что-то запрещающее замену новым, когдаdo_something
выкидывает? Если да, может, стоит включить в свой ответ. - person geza   schedule 02.11.2017