【问题标题】:Is it ok to return reference from pure virtual function?从纯虚函数返回引用可以吗?
【发布时间】:2011-06-24 08:47:36
【问题描述】:
class I {
public:
  virtual std::wstring const& GetName() const = 0;
};

通常实现此接口的客户端在其主体中包含其名称。一切正常。但有时“GetName”的结果是在函数执行期间计算的。使用静态变量来存储结果不是一个好主意。但是按值返回需要额外的性能开销。

那么如何解决这个问题呢?谢谢。

【问题讨论】:

    标签: c++ interface reference virtual-functions


    【解决方案1】:

    但是按值返回需要 额外的性能开销。

    这不是真的。编译器通常能够使用Return Value Optimization 删除副本。

    【讨论】:

    • 不。 RVO 在这种情况下不起作用。刚刚在 VS 2010 上测试过。pastebin.com/YCz6P4um
    • @anatoly:在这种情况下它不起作用,因为您返回的不是本地人,而是您班级的成员。在这种情况下,永远不能省略副本。你的问题并不清楚。
    【解决方案2】:

    在什么意义上可以?这是合法的 C++。它通常是非常糟糕的编程 练习,因为你提到的原因:它强加了一个(通常)不必要的 对派生类的限制。独立于virtual,您应该 仅在函数的语义需要时才返回引用; 如果该类型具有值语义,例如std::string,那么这将 只能是非常量引用。 (模板使问题有些复杂化, 并且像std::vector 这样的类返回一个是合理的 来自operator[] const 的 const 引用。)

    【讨论】:

      【解决方案3】:

      这似乎是个坏主意。如果开销真的很重要,您可以使用一些带有隐式共享(写时复制语义)的字符串容器,例如QString

      【讨论】:

      • 改用另一组开销?
      【解决方案4】:

      不要猜测性能问题:虽然人们经常通过 const 引用返回 std::string,但按值返回一个确实没什么大不了的,尤其是在您别无选择的情况下。

      实际上,您有时甚至可以更改后者,因为它只影响客户端代码的一些内容。

      记住:过早的优化是万恶之源。

      现在,要完全回答这个问题,您可以完美地在虚函数中返回一个引用(它是否是纯的并不重要)。只要确保永远不要返回对临时的引用。

      如果某个派生类需要执行昂贵的计算,它仍然可以将结果存储在成员 std::wstring 中并返回对该成员的引用。但再次强调,不要猜测性能问题:首先进行衡量,只有当这似乎是瓶颈时才关注它。

      【讨论】:

        【解决方案5】:

        尽管其他人似乎都同意这是一个非常糟糕的主意(出于各种原因,所有这些都是正确的),但我认为返回 @ 没有任何问题从根本上 987654321@.

        这样做

        • 在技术上是合法的,并且可以正常工作(它只是制定了派生类必须以某种尚未指定的方式履行的“合同”)
        • 可能是一个微不足道的微优化(这也可能与优化构建中的 RVO 没有什么不同),但它也没有伤害......到目前为止,那又如何
        • 不允许调用者修改名称,这是有道理的(调用者没有能力这样做,这就是他必须首先询问的原因!)——这在语义上实际上是一件好事
        • 不管实际未知的实现如何,即使是临时的(因为对于 const 引用,标准将局部变量的生命周期延长到引用的生命周期)

        所以,虽然有点不寻常,但如果它按照您的意愿行事(特别是明确指出调用者可能不会修改字符串),我认为没有绝对的理由不这样做。

        【讨论】:

          猜你喜欢
          • 2018-08-05
          • 2016-02-05
          • 2019-12-14
          • 2015-09-09
          • 1970-01-01
          • 1970-01-01
          • 2021-06-21
          • 2017-03-19
          • 2018-09-25
          相关资源
          最近更新 更多