【问题标题】:Will the c++ compiler optimize away unused return value by `reference`?c++ 编译器会通过“reference”优化掉未使用的返回值吗?
【发布时间】:2011-06-26 17:27:05
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这假定编译器将处理该函数一次,而不是每次调用它时都处理它。许多现代编译器做(或可以配置做)后者。他们这样做的原因之一就是为了允许这种优化。
    • “除非编译器没有内联代码” - 意思是“现在,使用 LTO,所有非共享对象代码都可以内联,所以可能是的”:-)
    • @underscore_d: 再说一遍......如果 LTO 内联增益不会避免返回的参考......
    • @DavidRodríguez-dribeas 你是什么意思?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多