1

Я прочитал много статей о оптимизации возвращаемого значения. Тем не менее, я не уверен, чтобы полностью понять, если это то, что происходит в следующем случае (адрес фактически всегда идентичен): неОптимизация возвращаемого значения при возврате по ссылке

#include "stdafx.h" 

class Type 
{ 
public: 
    Type(int a) { m_a = a; } 
private: 
    Type(const Type & other) {} 
    int m_a; 
}; 

class Base 
{ 
public: 
    Base() : instance(42) {} 
    virtual Type & GetType() 
    { 
     printf("Base: Address of instance: %i\n", &instance); 
     return instance; 
    } 

private: 
    Type instance; 
}; 

class Derived : public Base 
{ 
public: 
    virtual Type & GetType() 
    { 
     printf("Derived\n"); 
     return Base::GetType(); 
    } 
}; 

int main() 
{ 
    printf("Base class\n"); 
    Base b; 
    printf("Main: Address of instance: %i\n", &(b.GetType())); 

    printf("\nDerived class\n"); 
    Derived d; 
    printf("Main: Address of instance: %i\n", &(d.GetType())); 
} 

ли возвращения по ссылке всегда обеспечивает не конструктор копирования называется?
Или RVO происходит здесь?

+0

Спасибо за издание. Сначала я говорил о «каскадировании», поскольку мой фактический прецедент был для «рекурсивного» возвращения ссылки через иерархию наследования. Но в конце вопрос фактически не зависит от наследования, что теперь отражается в отредактированном заголовке. –

ответ

3

Возвращает ли ссылка по ссылке всегда гарантирует, что не будет создан конструктор копирования?

Да. Когда вы передаете или возвращаете по ссылке (в отличие от передачи/возврата по значению), копия не создается.

RVO место проведения здесь?

Поскольку вы возвращаетесь по ссылке, RVO здесь не имеет никакого отношения. RVO - это метод оптимизации, который заключается в устранении создаваемой резервной копии, в то время как возвращается по значению.

РВО может занять место, если у вас есть функция, как это:

Type GetType() 
{ 
    Type instance; 
    //... 
    return instance; 
} 
//... 
Type t = GetType(); 

затем РВ компилятор попытается устранить избыточную конструктора копирования и деструктор звонков, что означает, что местный instance из функция GetType будет назначена переменной t без создания копии.

4

Действительно ли возврат по ссылке всегда гарантирует, что конструктор копирования не будет вызван?

RVO - это метод оптимизации. Стандарт не гарантируется. Большинство компиляторов будут применять RVO, когда вы верните значение.

virtual Type & GetType() 
     ^^^^^^ 

Вы возвращения по ссылке здесь, что означает копии не должна быть создана таким образом, нет никаких накладных копии вызова конструктора и, следовательно, нет никаких шансов или сферы РВА.

адреса фактически всегда идентичны

Адреса фактически всегда идентичны, поскольку они являются адреса одного и того же члена класса.

Смежные вопросы