C++ if/else vs虚拟功能:设计性能

C++ if/else vs虚拟功能:设计性能,c++,if-statement,virtual-functions,C++,If Statement,Virtual Functions,我遇到了两种设计来获取层次结构中元素的根,层次结构本身就是派生类。 出于好奇,我想知道最优雅的是否也是最高效的。 以下是不那么优雅的版本: class Element { public: Root* root() { if(mParent) return mParent->root(); else return static_cast<Root*>(this); } prot

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

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

class Root : public Element
{};
我知道我不应该过早地担心性能,我已经选择了第二个选项,但我在理论层面上很好奇,想知道在元素经常调用函数的情况下,是否有任何因素(缓存未命中?)会使一种方法优于另一种方法

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

出于好奇,我想知道最优雅的是 也是最有效的

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

  • 需要表演吗?使用CRTP。我也看到了
    switch
    语句,但这应该是您的极值比率
  • 好的设计?使用虚拟函数。它们非常常见(例如,
    std::streambuf
    使用它们),而且很多语言在任何地方都使用它们(接口等):是的,这是有成本的,但它不会明显影响代码,除非您处于需要高频率的长周期运行循环中
  • 他们两个?轮廓你需要衡量和分析电话的费用,如果费用太高,你会寻找一种更快的方式。但是,要建立个人档案,你必须要有一个基础
你应该用两种方法来衡量你的程序执行情况。@请允许我第一个说:yikes。你能帮我理解在什么情况下把父类当作子类来对待是个好主意吗?我的意思是,如果你只想调用它的父功能,为什么不把这两个都当作父类呢?投票赞成以“太宽泛”作为结束语。我相信人们可以就此写一篇博士论文。@JonathanMee在这种情况下,相同元素的层次结构的根具有更多的信息和特征,但除此之外,其行为与其他元素完全相同。父类从未被视为子类,因为此代码的实现者知道根元素被确保为子根类型。这是从叶子中提取根的最直接的方法。@JonathanMee:有很多遗传行为的例子,这些行为是相同的。例如,在CSS中,样式是继承的。。。但是,可以有一个更具体的样式定义来提供所有内容,这样在实践中就不会有任何内容落入父级。常规样式与特定样式不同的唯一方式是要求父样式提供所有样式,因为没有外部样式可以遵循。现在,CSS不是一个纯树。。。但它确实显示了可行性。
class Element
{
public:
    virtual Root* root() { return mParent->root(); }
protected:
    Element* mParent;
};

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