C++编译器是否会通过“引用”优化未使用的返回值?

14

如果有人说“优化前先分析性能瓶颈”,请先别急,这只是一个好奇的问题,源自于这个原始问题

假设我通过引用返回了同一对象,如果不使用该对象,那么它会被优化掉吗?例如,我有一个 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()而不利用返回值,编译器会是否会完全抛弃返回值,使函数变得好像根本没有返回值?如果它不是内联的呢?

2个回答

14

在IT技术中,将引用作为参数或返回语句通常的实现方式类似于指针,并且成本非常小(在大多数情况下可以忽略不计)。根据调用约定,它可能只是一个寄存器中的单个存储。

至于是否可以优化掉返回值,除非编译器内联代码,否则不行。当编译器处理函数时,它不知道调用代码是否使用返回语句,这反过来意味着它必须始终返回某些内容。


2
这假设编译器只会处理函数一次,而不是每次调用它都要处理。许多现代编译器确实会(或可以配置为)后者。他们这样做的原因之一是允许精确地进行这种优化。 - David Schwartz
现在,随着LTO的出现,所有非共享对象代码都可以被内联,所以很可能是的 :-) - underscore_d
@underscore_d:再说一遍……如果LTO内联,那么收益不会避免返回的引用…… - David Rodríguez - dribeas
@DavidRodríguez-dribeas 你是什么意思? - underscore_d

5

如果函数没有被内联,那么返回值必须存储在某个地方,可能是CPU寄存器。这可能只需要一个寄存器复制。在大多数情况下,我会感到惊讶,如果开销超过了单个CPU周期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接