Если у меня есть класс А (который возвращает объект по значению), и две функции е() и г(), имеющая разницу в только их возвращении переменное:Как фактически функция возвращает значение?
class A
{
public:
A() { cout<<"constructor, "; }
A (const A&) { cout<<"copy-constructor, "; }
A& operator = (const A&) { cout<<"assignment, "; }
~A() { cout<<"destructor, "; }
};
const A f(A x)
{A y; cout<<"f, "; return y;}
const A g(A x)
{A y; cout<<"g, "; return x;}
main()
{
A a;
A b = f(a);
A c = g(a);
}
Теперь, когда я исполняю линию A b = f(a);
, он выводит:
copy-constructor, constructor, f, destructor
, который прекрасно согласен с тем, что объект y в f() создается непосредственно в пункте назначения, т.е. в ячейке памяти объекта b, и не задействован времен.
Хотя, когда я исполняю линию A c = g(a);
, она выводит:
copy-constructor, constructor, g, copy-constructor, destructor, destructor,
.
Итак, вопрос в том, почему в случае g() невозможно создать объект в ячейке памяти c, как это произошло при вызове f()? Почему он вызывает дополнительный экземпляр-конструктор (который, я полагаю, из-за участия временного) во втором случае?
Если вы хотите, чтобы компилятор выполнял оптимизацию, вам придется скомпилировать с включенными оптимизациями. –
Я не думаю, что это имеет какое-то отношение к оптимизации компилятора, как я уже пробовал. – cirronimbo