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

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

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

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

ИЛИ

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

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

Ответ 1

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

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

Ответ 2

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