Я новичок в 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 года.
Оптимизация возвращаемого значения (RVO) утверждает, что компилятор Можно elide одна или обе копии, но это не обязательно. Это означает, что:
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());
МСДН имеет много деталей о том, как Visual C ++ компилятор обрабатывает RVO. В нем есть несколько интересных примеров кода, которые объясняют, как это эффективно работает.
Других решений пока нет …