Оптимизация возвращаемого значения из вложенной области видимости

0

Будет ли оптимизация возвращаемого значения в следующем примере? (Возможно, вопрос, зависящий от компилятора. В этом случае, я полагаю, мне интересно, "типичных" современных компиляторов, таких как недавний clang/gcc.)

Blah factory() {
  return Blah();
}

void func() {
  Blah blah;
  if (condition) {
    blah = factory();
    blah.DoSomething();
  } else {
    blah = factory();
    blah.DoSomethingElse();
  }
  blah.DoOneMoreThing();
}

Я знаю, что я явно не строю объект в той же строке, что и вызов фабричной функции, но достаточно умный компилятор может определенно оптимизировать копии в приведенном выше примере (поскольку экземпляр blah не был затронут до того, как был установлен на factory()).

Если RVO действительно не произойдет, есть ли способ избежать копирования без изменения factory?

  • 2
    Этот код выглядит очень знакомым .
  • 1
    Почему бы и нет: Blah x = factory(); if (condition) { xf(); } else { xg(); } xh(); ?
Показать ещё 3 комментария
Теги:
compiler-optimization

1 ответ

1

В вашей программе не будет никакой оптимизации возвращаемого значения, потому что Blah blah; вызывает конструктор по умолчанию, который может иметь побочные эффекты (например, печать сообщения или блокировка мьютекса), а компилятору C++ не разрешено оптимизировать это. Как только blah был сконструирован по умолчанию, он не может быть сконструирован снова в назначениях ниже, но оптимизация возвращаемого значения потребует построения.

Однако, если ваши определения оператора конструктора и оператора присваивания доступны для компилятора, он может оптимизировать сгенерированный код, чтобы он мог в конечном итоге оказаться таким же, как и конструктор копирования. Но это не гарантировано.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню