Почему возврат по ссылке быстрее, чем возврат по значению?

class A
{
    int x,y;
    public:
       A(int a=0,int b=0)
       {x=a;y=b;}
    /* ... */
}

A& fctr()
{
    A loc(1,2);
    return loc;
}

Давайте рассмотрим эту инструкцию:

A x=fctr();

fctr() возвращает ссылку на уничтоженный объект... ‹‹ проблема не в этом -_-

В приведенной выше инструкции и на основе ссылки, возвращаемой fctr, программа копирует уничтоженный объект loc в x.

С другой стороны, возврат по значению copy объекта loc в x !!

Единственная разница, которую я вижу, заключается в том, что при возврате по ссылке объект loc уничтожается, но при возврате по значению объект loc не уничтожается пока инструкция не будет закончено.

Поэтому возврат по значению кажется безопасным и делает то же самое, что и возврат по ссылке!!

Что я читал в книгах и что слышал от людей, так это то, что возврат по ссылке быстрее, чем возврат по значению...

Так почему же возврат по ссылке быстрее, чем возврат по значению?

... Я думаю, что я в чем-то не прав, но я не знаю, что это такое?!!!


person Az.Youness    schedule 12.08.2013    source источник
comment
это не проблема -_- это проблема.   -  person GManNickG    schedule 12.08.2013
comment
Это не быстрее. Это неопределенное поведение.   -  person juanchopanza    schedule 12.08.2013
comment
Я знаю, что это проблема -_-, но сейчас я говорю о том, какой из двух способов быстрее и почему...   -  person Az.Youness    schedule 12.08.2013
comment
Почему возврат ссылки на временный объект не является проблемой? Копия создается, потому что тип x равен A; если вы измените его на A& x = fctr();, копия не будет сделана, и вы будете ссылаться на недопустимую память. Даже сейчас ваша программа имеет неопределенное поведение, поскольку, как вы заметили, копия создается после уничтожения временного файла. Возврат по ссылке следует выполнять только в том случае, если вы знаете, что время жизни резервного хранилища больше или равно сроку службы того, что будет получать ссылку.   -  person Praetorian    schedule 12.08.2013
comment
Что такое a в fctr?   -  person aschepler    schedule 12.08.2013
comment
когда мы перегружаем такие операторы, как +, мы возвращаем ссылку, это не то же самое!   -  person Az.Youness    schedule 12.08.2013
comment
@BBeta Типичная реализация operator+ не возвращает ссылку; Я думаю, вы путаете это с operator+=. Например, взгляните на сигнатуры различных операторов, перегруженных std::complex. .   -  person Praetorian    schedule 12.08.2013
comment
Нет гарантии, что возврат по ссылке будет быстрее. Если у объекта есть только один целочисленный член и нет кода в конструкторе копирования, я ожидаю, что возврат по значению будет быстрее, но не намного.   -  person Mark Ransom    schedule 13.08.2013


Ответы (1)


Возврат по ссылке. Системе не нужно выделять и инициализировать дополнительную память. Просто нужно передать адрес памяти уже существующего местоположения.

Возврат по значению. Системе необходимо выделить и инициализировать дополнительную память.

Это полностью зависит от требований, нужно ли вам «по ссылке» или «по значению».

person Udit    schedule 12.08.2013