Будет ли компилятор c ++ оптимизировать удаление неиспользуемого возвращаемого значения с помощью `reference`? - PullRequest
10 голосов
/ 26 июня 2011

Прежде чем кто-то прыгнет и скажет Profile before optimize!, это просто вопрос из любопытства и проистекает из этого оригинального вопроса .

Если я возвращаюсь по ссылке на тот же объект, будет ли он оптимизирован, если не используется? Например, у меня есть Vector<>, который имеет различные математические функции (предположим, я не использую перегрузку операторов). Два способа написания:

inline void Vector::Add(const Vector& in) // Adds incoming vector to this vector

OR

inline Vector& Vector::Add(const Vector& in) // Adds incoming vector to this vector and returns a reference to this vector

Теперь, если Add() используется без использования возвращаемого значения, будет ли компилятор просто отбрасывать возвращаемое значение полностью, и функция становится такой, как будто у нее нет возвращаемого значения для начала? А что если это НЕ inlined?

Ответы [ 2 ]

11 голосов
/ 26 июня 2011

Ссылки в качестве аргументов или операторов возврата обычно реализуются способом, аналогичным указателям, и стоимость минимальна (в большинстве случаев пренебрежимо мала).В зависимости от соглашения о вызовах это может быть одно хранилище в регистре.

Относительно того, можно ли оптимизировать возврат, если компилятор не вставляет код no, он не может.Когда компилятор обрабатывает функцию, он не знает, будет ли вызывающий код использовать оператор return, и это, в свою очередь, означает, что он всегда должен возвращать что-то.

4 голосов
/ 26 июня 2011

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

...