Будет ли компилятор С++ оптимизировать неиспользуемое возвращаемое значение по «ссылке»?

Прежде чем кто-то прыгнет и скажет 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?


person Samaursa    schedule 26.06.2011    source источник


Ответы (2)


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

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

person David Rodríguez - dribeas    schedule 26.06.2011
comment
Это предполагает, что компилятор обработает функцию один раз, а не при каждом вызове. Многие современные компиляторы делают (или могут быть настроены для этого) последнее. Одна из причин, по которой они это делают, заключается в том, чтобы разрешить именно такую ​​оптимизацию. - person David Schwartz; 21.09.2011
comment
если компилятор не встраивает код нет - это означает, что «в настоящее время с LTO можно встроить весь код, не являющийся общим объектом, так что, вероятно, да» :-) - person underscore_d; 13.07.2016
comment
@underscore_d: опять же ... если LTO встраивает, выигрыш не будет избегать возвращаемой ссылки ... - person David Rodríguez - dribeas; 14.07.2016
comment
@DavidRodríguez-dribeas Что ты имеешь в виду? - person underscore_d; 14.07.2016

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

person Tim Armstrong    schedule 26.06.2011