c++ - if/else 与虚函数 : design performance

标签 c++ if-statement virtual-functions

我遇到了两种获取层次结构中元素根的设计,它本身是派生类。 出于好奇,我想知道最优雅的是否也是最高效的。 这是不太优雅的版本:

class Element
{
public:
    Root* root()
    {
        if(mParent)
            return mParent->root();
        else
            return static_cast<Root*>(this);
    }
protected:
    Element* mParent;
};

class Root : public Element
{};

这里更优雅,它使用虚函数代替 if else 来获取根。

class Element
{
public:
    virtual Root* root() { return mParent->root(); }
protected:
    Element* mParent;
};

class Root : public Element
{
public:
    virtual Root* root() { return this; }
};

我知道我不应该过早地担心性能,我已经选择了第二个选项,但我在理论上很好奇,想知道是否有任何因素(缓存未命中?)会使一种方法更优越在函数经常被元素调用的上下文中传递给另一个?

注意:如果我添加层次结构将按 5-20 个元素深度的顺序添加信息,我不认为这个问题如此“广泛”。这实际上是一个非常实际的问题。

最佳答案

Just as a matter of curiosity, I was wondering if the most elegant was also the most efficient.

非典型。寻找好的设计需要时间和经验;进一步优化它,它很容易失败。确实有很多话要说,但我会尽量缩小范围:

  • 需要性能?使用 CRTP。我也见过 switch 语句,但那应该是你的极值比率。
  • 好的设计?使用虚函数。它们非常常见(例如 std::streambuf 使用它们)并且许多语言在任何地方都使用它们(接口(interface)等):是的,有成本,但它不会明显影响您的代码除非您处于需要高频率的长时间运行循环中。
  • 他们两个?轮廓!您需要衡量和推理该调用的成本,如果成本太高,您将寻找更快的方法。但是要进行概要分析,您必须有一个可以与之合作的基础!

关于c++ - if/else 与虚函数 : design performance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26834789/

相关文章:

c++ - 如何安全地删除 C++ 中的 posix 计时器?

c++ - I/O 完成端口的异步操作返回 0 字节传输

javascript - if/else 语句不适用于页面加载

if-statement - 为什么python中的这段代码有效?没有if匹配else

ruby - setter方法和虚拟方法(在Ruby中)有什么区别?

c++ - 类构造函数中冒号后的参数?

c++ - c++中某些类型转换的问题

java - 我正在尝试使用包含 java 扫描器的 if/else 语句来创建用户名和密码应用程序

c++ - std::tuple 到成员函数

C++ 虚拟方法,不需要 "this"指针 - 优化