C++ 特性与虚拟开销

C++ 特性与虚拟开销,c++,performance,templates,virtual,traits,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(

我看到了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;
    }
};
//示例6:引用计数特征
//
模板
类引用计数属性
{
静态空隙率(T*p)
{
p->IncRef();//假定RefCounted接口
}
静态空隙释放器(T*p)
{
p->DecRef();//假定RefCounted接口
}
};
模板
类引用计数属性
{
静态无效引用(小部件*p)
{
p->AddReference();//使用小部件接口
}
静态void Unrefer(小部件*p)
{
//使用小部件接口
如果(p->RemoveReference()==0)
删除p;
}
};

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

在典型的生产优化级别(
-O2
/O2
)您可以期望所有显示的代码都是内联的,并且没有副作用的位都得到优化。这就剩下了对
IncRef
AddReference
的实际调用,以及检查和
delete
-ion

如果使用了
virtual
函数,并且引用计数代码很小(例如,线程不安全),则由于调度表查找和离线函数调用,其速度可能会慢一个数量级,但这会因编译器、精确优化设置、CPU、调用约定等而有所不同


像往常一样,当你不得不关心、分析和实验时。

如果我理解得很好,优化后的代码就像直接调用p->IncRef(),而指针没有复制正确?一个数量级似乎太多了。完全同意评测:)“…对吗?”对。“太多了一个数量级”-即使调用运行时交换机选择的一个微不足道的函数与虚拟分派相比,也会得到9.2倍的影响,但测量和共享您自己的基准代码/发现总是很好的。在这种情况下,当需要线程安全时,
IncRef()
DecRef()
可能不是那么简单,因此额外虚拟分派的影响将更小。