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

Sam*_*rsa 10 c++ reference return-value-optimization

在有人跳过并说Profile before optimize!,这只是一个好奇的问题,源于这个原始问题.

如果我通过引用返回相同的对象,如果不使用它会被优化掉吗?例如,我有一个Vector<>具有各种数学函数(假设我没有使用运算符重载).两种写作方式:

inline void Vector::Add(const Vector& in) // Adds incoming vector to this vector
Run Code Online (Sandbox Code Playgroud)

要么

inline Vector& Vector::Add(const Vector& in) // Adds incoming vector to this vector and returns a reference to this vector
Run Code Online (Sandbox Code Playgroud)

现在如果Add()在不使用返回值的情况下使用,编译器是否会完全抛弃返回值并且函数变得好像没有返回值开始?如果不是inlined呢?

Dav*_*eas 11

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

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

  • 这假设编译器将处理该函数一次,而不是每次调用它时都处理它.许多现代编译器(或可以配置为)执行后者.他们这样做的原因之一是准确地进行这种优化. (2认同)

Tim*_*ong 5

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