C ++ 11 — 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) утверждает, что компилятор Можно 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. В нем есть несколько интересных примеров кода, которые объясняют, как это эффективно работает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]