Оптимизация возвращаемого значения C++
Я новичок в C++, и я немного читал об оптимизации возвращаемых значений на вики и на этом веб-сайте, однако мне все еще интересно, как происходит следующее поведение:
using namespace std;
class A
{
public:
A() {cout << "A Ctor" << endl;}
A(const A &a) {cout << "A copy Ctor" << endl;}
};
A Foo()
{
A a;
return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Foo()" << endl;
Foo();
cout << "Foo() and new object" << endl;
A b(Foo());
return 0;
}
и вывод:
Foo()
A Ctor
A copy Ctor
Foo() and new object
A Ctor
A copy Ctor
мой вопрос, почему Foo();
а также A b(Foo());
оба вызвали только один вызов конструктора копирования? Означает ли это, что возвращенное скопированное значение из Foo()
может быть использован для создания объекта b
в этом месте, чтобы конструктор b не нужно было вызывать снова? Это было основано на визуальной студии 2010 года.
1 ответ
Оптимизация возвращаемого значения (RVO) гласит, что компилятор может исключить одну или обе копии, но это не обязательно. Это означает, что:
A a (Foo());
Свободно делать 0, 1 или 2 конструктора копирования:
2 - В функции Foo(), A a
создает A
, Когда он пытается вернуться, он копирует A
в возвращаемое значение; результирующая инициализация A a(Foo());
копирует результат Foo()
в новый A
,
1 - Одна из этих копий не происходит (вероятно, копия в Foo
возвращаемое значение.
0 - Ни одна из этих копий не произойдет. A a
создано внутри Foo
напрямую становится A
создано в этой строке: A a(Foo());
Msdn имеет много подробностей о том, как компилятор Visual C++ обрабатывает RVO. В нем есть несколько интересных примеров кода, которые объясняют, как это эффективно работает.