我经常使用CRTP从基类调用派生类函数。它的好处是不会产生虚函数调用的成本,例如:
template< class Derived >
class Base
{
public:
void foo()
{
static_cast<Derived*>(this)->foo_impl(); // Non virtual derived class call
}
};
class Derived : public Base<Derived>
{
private:
void foo_impl()
{
// Do Stuff
}
};
C++11 引入了final
将虚函数(或类)标记为 final 的语言标识符,告诉编译器不会再对该函数进行覆盖。
我的理解(来自 Going Native 2013 演示文稿)如果将虚函数标记为final
编译器可以优化代码以消除虚函数调用的开销。
Ergo 在上面的示例中,可以删除 CRTP,并且仍然避免了虚函数调用的开销,前提是派生类将虚函数标记为final
ie:
class Base
{
public:
virtual void foo_impl() = 0;
void foo()
{
foo_impl(); // Non virtual derived class call
}
};
class Derived : public Base
{
public:
// function marked as final, no virtual function call overhead
virtual void foo_impl() final
{
// Do Stuff
}
};
如果是这种情况,是否有关于哪种方法最好的建议?
是否仍应首选 CRTP,因为它保证函数调用是非虚拟的,而final
不能依赖基于的优化?