特征与虚拟开销

时间:2017-03-09 15:33:52

标签: c++ performance templates virtual traits

我遇到了关于特征的Alexandrescu教程,我有一些想法可以分享。这是代码:

// Example 6: Reference counting traits
//
template <class T>
class RefCountingTraits
{
    static void Refer(T* p)
    {
    p->IncRef(); // assume RefCounted interface
    }

    static void Unrefer(T* p)
    {
    p->DecRef(); // assume RefCounted interface
    }
};

template <>
class RefCountingTraits<Widget>
{
    static void Refer(Widget* p)
    {
    p->AddReference(); // use Widget interface
    }
    static void Unrefer(Widget* p)
    {
    // use Widget interface
    if (p->RemoveReference() == 0)
        delete p;
    }
};

在这种情况下,与标准虚拟功能成员案例相比,我们有多少开销?在这种情况下,我们也不是直接访问对象:我们仍在传递指针。编译器是否能够以相同的方式对其进行优化?

1 个答案:

答案 0 :(得分:1)

在典型的生产优化级别(-O2/O2),您可以预期所有显示的代码都会被内联,并且没有副作用的位被优化掉。这会将实际调用留给IncRefAddReference,并检查和delete - 离开。

如果使用了virtual函数,并且引用计数代码是微不足道的(例如,不是线程安全的),由于调度表查找和超出范围,它可能已经慢了一个数量级。行函数调用,但这会与编译器,精确优化设置,CPU,调用约定等有所不同。

与往常一样,当您需要关心,剖析和实验时。