Оптимизация компилятора

Итак, у меня есть вопрос для вас. :) Можете ли вы сказать мне выходной код, следующий код должен производить?

#include <iostream>
struct Optimized
{
    Optimized() { std::cout << "ctor" << std::endl; }
    ~Optimized() { std::cout << "dtor" << std::endl; }
    Optimized(const Optimized& copy) { std::cout << "copy ctor" << std::endl; }
    Optimized(Optimized&& move) { std::cout << "move ctor" << std::endl; }
    const Optimized& operator=(const Optimized& rhs) { std::cout << "assignment operator" << std::endl; return *this; }
    Optimized& operator=(Optimized&& lhs) { std::cout << "move assignment operator" << std::endl; return *this; }
};

Optimized TestFunction()
{
    Optimized a;
    Optimized b = a;
    return b;
}

int main(int argc, char* argv[])
{
    Optimized test = TestFunction();
    return 0;
}

Мой первый ответ будет:

  1. CTOR
  2. COPY CTOR
  3. Переместить CTOR
  4. DTOR
  5. DTOR
  6. DTOR

И это правда, но только если оптимизация компилятора выключена . При включении оптимизации вывод полностью отличается. С включенной оптимизацией вывод:

  1. CTOR
  2. COPY CTOR
  3. DTOR
  4. DTOR

с оптимизацией компилятора, тестовая переменная является обратной переменной.

Мой вопрос, какие условия приведут к тому, что это не будет оптимизировано таким образом?

Я всегда учил, что возвращение структуры / класса, которые приводит к тому, что приводит к дополнительной копии конструкторов, могут быть лучше оптимизированы путем передачи в качестве ссылки Но компилятор делает это для меня. Так что возврат структура все еще считается плохой формой?

11
задан BabelFish 31 August 2011 в 19:16
поделиться