2011-06-26 40 views
10

在有人跳跃并说Profile before optimize!之前,这只是一个好奇心问题,起源于this original questionC++编译器会通过`reference`优化掉未使用的返回值吗?

如果我通过引用返回相同的对象,如果不使用它会得到优化吗?例如,我有一个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

回答

11

作为参数或返回语句的引用通常以类似于指针的方式实现,并且成本是最小的(在大多数情况下可忽略不计)。根据调用约定,它可以是注册表中的单个商店。

至于是否可以优化返回,除非编译器内联代码否,否则不能。当编译器处理函数时,它不知道调用代码是否使用return语句,这又意味着它必须总是返回的东西。

+0

+1,还有一个不错的答案,正如往常一样:) –

+2

这假设编译器会处理一次函数,而不是在每次调用函数时处理函数。许多现代编译器都可以(或可以配置这样做)后者。他们这样做的原因之一就是准确地进行这种优化。 –

+0

“除非编译器内嵌代码否” - 意思是'现在,使用LTO,所有非共享对象代码都可以内联,所以可能是':-) –

4

如果函数未内联,则返回值必须存储在某处,可能是CPU寄存器。这可能只需要一个寄存器副本。在大多数情况下,如果开销超过单个CPU周期,我会感到惊讶。