Оптимизация возвращаемого значения 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. В нем есть несколько интересных примеров кода, которые объясняют, как это эффективно работает.

Другие вопросы по тегам