gpt4 book ai didi

c++ - 什么更快 : down-cast from virtual base or cross-cast?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:36 32 4
gpt4 key购买 nike

这有点假设,因为我不太担心性能 - 只是想知道一般来说哪个选项实际上最快/最有效,或者是否没有任何区别。

假设我有以下支持重载的访问者模板代码:

#define IMPLEMENT_VISITOR_WITH_SUPERCLASS(superclass)  \
typedef superclass visitor_super_t; \
virtual void visit(Visitor& v) { v.visit(*this); }
//-----------------------------------------------------------------------------
// Implementation detail:
// Selective dispatcher for the visitor - required to handle overloading.
//
template <typename T>
struct VisitorDispatch {
static void dispatch(Visitor* v, T* t) { v->visit(*t); }
};
// Specalization for cases where dispatch is not defined
template <> struct VisitorDispatch<void> {
static void dispatch(Visitor* v, void* t) { throw std::bad_cast(""); }
};

//-----------------------------------------------------------------------------
// Derive visitors from this and 'Visitor'.
template <typename T>
class VTarget
{
public:
// Don't really need a virtual dtor.
virtual void dispatch(T& t) = 0;
};

//-----------------------------------------------------------------------------
class Visitor
{
public:
virtual ~Visitor() = 0;

template <typename T>
void visit(T& t) {
typedef VTarget<T> target_t;
target_t* tgt = dynamic_cast<target_t*>(this);
if (tgt) {
tgt->dispatch(t);
}
else {
// Navigate up inhertiance hierarchy.
// requires 'super' to be defined in all classes in hierarchy
// applicable to this visitor.
typedef typename T::visitor_super_t super;
super* s = static_cast<super*>(&t);
VisitorDispatch<super>::dispatch(this, s);
}
}
};

//-----------------------------------------------------------------------------
inline Visitor::~Visitor() {}

然后用于创建通用访问者:

class CommonBase { 
IMPLEMENT_VISITOR_WITH_SUPERCLASS(void)
virtual ~CommonBase() = 0;
};
class A : public CommonBase {
IMPLEMENT_VISITOR_WITH_SUPERCLASS(CommonBase)
};
class B : public CommonBase {
IMPLEMENT_VISITOR_WITH_SUPERCLASS(CommonBase)
};

class MyVisitor
: public Visitor
, public VTarget<CommonBase>
, public VTarget<A>
, public VTarget<B>
{
public:
virtual void dispatch(CommonBase& obj);
virtual void dispatch(A& obj);
virtual void dispatch(B& obj);
};

使用访问者最终会导致 dynamic_cast<>来自 VisitorVTarget<T> ,这是一个交叉转换。

另一种实现方式是制作Visitor VTarget<T> 的虚拟基地- MyVisitor然后将不再需要直接从 Visitor 继承。dynamic_cast<>在 Visitor::visit 代码中然后将导致从虚拟基础向下转型,Visitor .

执行转换时,一种方法是否比另一种方法更快?还是您只会因为拥有虚拟基地而受到尺寸惩罚?

最佳答案

嗯,看起来 cross-cast 方法比 virtual base 方法更快。

对于需要 1 次回退到父类(super class)的访问,超过 100000000 次迭代,交叉转换方法耗时 30.2747 秒,虚拟基方法耗时 41.3999 - 大约慢了 37%。

在父类(super class)没有回退到重载的情况下,交叉转换为 10.733 秒,虚拟基础为 19.9982(慢 86%)。

我更想知道 dynamic_cast 如何在两种模式下运行,真的。

关于c++ - 什么更快 : down-cast from virtual base or cross-cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6940856/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com