2015-10-03 1 views
0

Это, очевидно, плохо:C++ Является ли это неверной ссылкой после возвращения?

int& GetInvalidIntPtr(){ 
    int i; 
    return i; 
} 

Это мой пример:

FVector& GetDirectionFromCamera(){ 
    return GetActorLocation() - GetCameraComponent()->GetComponentLocation(); 
} 

FVector в основном имеет 3 поплавки, поэтому я хотел бы вернуть ссылку, а не копию. Однако, я считаю, результат расчета хранится в стеке, верно?
Или результат, выделенный на куче, потому что я немедленно возвращаю его?

+1

Это зависит от сигнатур и поведения функций и операторов во втором примере. Итак, если они возвращают ссылку на объект, созданный в куче, вы в порядке. Если нет, вы не в порядке. –

+2

Невозможно сказать, не зная, что возвращает 'operator-', но правильный ответ прост: верните копию, перестаньте пытаться оптимизировать крошечную стоимость копирования трех поплавков. [Keep It Simple, Stupid] (https://en.wikipedia.org/wiki/KISS_principle). –

ответ

1

FVector в основном имеет 3 поплавки, поэтому я хотел бы вернуться на адрес, а не копии.

Адрес электронной почты: Если вы хотите вернуть адрес, то почему вы вернете ссылку вместо этого? Ссылки не являются указателями.

(Удаляется, потому что вопрос был изменен, чтобы использовать слово «эталонный» вместо «адреса».)


Однако, я считаю, что результат расчета хранится на стек, правильно?

Это действительно зависит от того, что именно возвращает ваш operator-. Вы не показываете нам, поэтому мы не можем точно знать, но если оператор просто возвращает FVector (как следует), то ваш код не может скомпилировать, поскольку временный FVector не может использоваться для инициализации FVector&.

Как правило, ваш код основан на неправильном понимании того, что как-то плохо вернуть копию FVector. Это не. Измените подпись функции на FVector GetDirectionFromCamera() и дайте компилятору удалить избыточные копии.

Или результат, выделенный на кучу, потому что я немедленно возвращаю его?

No. Вы называете «кучу» только в том случае, если вы используете динамическое распределение.

+0

Я изменил адрес на ссылку в моем вопросе. Спасибо за информацию. –

2

Или результат, выделенный на кучу, потому что я немедленно возвращаю его?

Что? Как это могло случиться? Компилятор не просто магически выделяет вещи в куче, потому что вы возвращаете то, что выходит за рамки.

Попытка оптимизировать копию трех поплавков, рискуя неопределенным поведением, потому что вы не понимаете, что действительно делает код, является безумием. Если вы не знаете ничего лучше, просто верните копию. Это простой и безопасный вариант. Это также, вероятно, будет самым быстрым, потому что простой код позволяет компилятору оптимизировать лучше.

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