c ++编译器会通过`reference`优化掉未使用的返回值吗?

时间:2011-06-26 17:27:06

标签: c++ reference return-value-optimization

在有人跳过并说Profile before optimize!之前,这只是一个好奇心问题,源于this original question

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

答案 0 :(得分:11)

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

关于是否可以优化返回,除非编译器内联代码否,否则它不能。当编译器处理函数时,它不知道调用代码是否会使用return语句,而这反过来意味着它必须始终返回

答案 1 :(得分:4)

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