Это не может быть гарантировано.Если вы попытаетесь написать такую гарантию согласованно, вы не сможете это сделать.
Например, рассмотрим следующий код:
std::string f() {
std::string first("first");
std::string second("second");
return FunctionThatIsAlwaysFalse() ? first : second;
}
Функция FunctionThatIsAlwaysFalse
всегда возвращает false
, но вы можете сказать это, только если выполняете межмодульную оптимизацию.Должен ли стандарт требовать от каждого отдельного компилятора межмодульной оптимизации, чтобы он мог использовать RVO в этом случае?Как это будет работать?Или это должно запретить любому компилятору использовать RVO, когда необходима межмодульная оптимизация?Как это будет работать?Как это может остановить компиляторы, которые достаточно умны, чтобы видеть, что RVO возможно делать это, и те, которые не делают этого?
Должен ли стандартный список, который каждый компилятор оптимизации должен поддерживать с RVO?И должен ли он запретить RVO в других случаях?Разве это не победило бы с точки зрения оптимизации компиляторов?
А как насчет случаев, когда компилятор считает, что RVO снизит производительность?Нужно ли компилятору выполнять оптимизацию, которую он считает плохой?Например:
if(FunctionCompilerKnowsHasNoSideEffectsAndThinksMostlyReturnsFalse())
return F(3); // Here RVO is a pessimization
else
{
Foo j=F(3);
return Foo(j);
}
Здесь, если компилятору не требуется выполнять RTO, можно избежать if
и вызова функции, поскольку без RTO код одинаков в обеих половинах.Если вы заставите компилятор выполнить оптимизацию, которая, по его мнению, ухудшит ситуацию?Почему?
Нет действительно способа заставить такую гарантию работать.