Это не может быть гарантировано. Если бы вы попытались написать такую гарантию связно, вы бы обнаружили, что это невозможно.
Например, рассмотрим этот код:
std::string f() {
std::string first("first");
std::string second("second");
return FunctionThatIsAlwaysFalse() ? first : second;
}
Функция FunctionThatIsAlwaysFalse
всегда возвращает false
, но это можно сказать только в том случае, если вы выполняете межмодульную оптимизацию. Должен ли стандарт требовать, чтобы каждый отдельный компилятор выполнял межмодульную оптимизацию, чтобы в этом случае он мог использовать 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 код в обеих половинах одинаков. Следует ли заставлять компилятор выполнять оптимизацию, которая, по его мнению, ухудшает ситуацию? Почему?
На самом деле нет никакого способа заставить такую гарантию работать.
person
David Schwartz
schedule
07.12.2011
allowed
несколько запутанный термин. Это означаетguaranteed
или нет? - person iammilind   schedule 08.12.2011