我遇到了关于特征的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;
}
};
在这种情况下,与标准虚拟功能成员案例相比,我们有多少开销?在这种情况下,我们也不是直接访问对象:我们仍在传递指针。编译器是否能够以相同的方式对其进行优化?
答案 0 :(得分:1)
在典型的生产优化级别(-O2
或/O2
),您可以预期所有显示的代码都会被内联,并且没有副作用的位被优化掉。这会将实际调用留给IncRef
或AddReference
,并检查和delete
- 离开。
如果使用了virtual
函数,并且引用计数代码是微不足道的(例如,不是线程安全的),由于调度表查找和超出范围,它可能已经慢了一个数量级。行函数调用,但这会与编译器,精确优化设置,CPU,调用约定等有所不同。
与往常一样,当您需要关心,剖析和实验时。