【问题标题】:c++ virtual function performancec++虚函数性能
【发布时间】:2012-11-14 23:06:45
【问题描述】:

我有两个类foobar,其中一个是另一个的超类,它们都有一个方法hello_world

class foo {
    virtual void hello_world();
};
class bar : public foo {
    void hello_world();
};

我的问题是:如果我将其设为虚拟,性能会不会有所不同 对于barhello_world?会变成这样:

class foo {
    virtual void hello_world();
};
class bar : public foo {
    virtual void hello_world();
};

我将主要从bar 调用hello_world。 我知道虚函数会使函数变慢 因为我们确实运行时查找。但是对于这种情况,有什么区别吗?

【问题讨论】:

  • 很难确切地知道您在问什么,因为您的示例代码在语法上无效。但是,如果您要问是否将 virtual 关键字添加到已经是虚拟的函数(因为它是作为虚拟函数继承的)会改变性能,那么答案是否定的 - virtual 关键字在这种情况下根本没有效果.
  • 如果你设置了一个合理的测试,你实际上可以测量这个。我记得几年前就是这样做的,发现开销不值得担心。也许值得为您的应用程序担心,但我对此表示怀疑。
  • 这个问题不应该被关闭。它是具体的,可回答的和主题在这里。

标签: c++ performance virtual


【解决方案1】:

与具有相同逻辑的可内联函数相比,在类可能确实是多态的上下文中调用虚函数总是会产生一些性能影响。主要原因是调用函数的开销很小,查找需要调用的函数的开销很小,以及优化机会的重大损失。最后一点通常是最昂贵的。

原始示例没有编译,也就是说,很明显还没有进行性能分析。一旦您测量到您的代码运行速度太慢并且特定调用确实在性能问题所在的区域内,请担心性能影响。

【讨论】:

  • 无论他是否在 bar::hello_word() 上使用 virtual 关键字,他的代码中的 hello_word() 成员都是私有虚拟成员。
  • 在我看来,这夸大了(有点)虚函数对大多数现实世界应用程序的性能影响,更不用说玩具应用程序了。
  • Öö Tiib: 是的,函数是否为private 无关紧要:如果派生类的函数与基类的virtual 函数的签名匹配,它会覆盖功能。
  • @JohnDibling:我没有声称有很大的开销。根据函数中所做的事情,它可能重要也可能不重要。但是,如果在内部循环中调用微小的虚函数,这可能是一个问题。例如,在迭代类似向量的数据结构时调用 increment()、at_end() 和 get_value() virtual 函数可能会对性能产生重大影响。使一个函数格式化几个数字virtual 可能不会产生可衡量的影响。
  • 哦,我这里只是举个例子。在我的应用程序中,hello_world 对性能至关重要......
猜你喜欢
  • 2011-06-19
  • 2010-10-01
  • 2013-06-25
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多