【发布时间】:2015-03-14 18:07:36
【问题描述】:
作为系统设计的一部分,我们需要实现工厂模式。结合工厂模式,我们还使用 CRTP 来提供一组基本功能,然后可以通过派生类对其进行自定义。
下面的示例代码:
class FactoryInterface{
public:
virtual void doX() = 0;
};
//force all derived classes to implement custom_X_impl
template< typename Derived, typename Base = FactoryInterface>
class CRTP : public Base
{
public:
void doX(){
// do common processing..... then
static_cast<Derived*>(this)->custom_X_impl();
}
};
class Derived: public CRTP<Derived>
{
public:
void custom_X_impl(){
//do custom stuff
}
};
虽然这种设计很复杂,但它确实提供了一些好处。初始虚函数调用之后的所有调用都可以内联。派生类 custom_X_impl 调用也很高效。
我编写了一个比较程序来比较使用函数指针和虚函数的类似实现(紧密循环、重复调用)的行为。这种设计在使用 O2 和 O3 的 gcc/4.8 中取得了胜利。
然而,一位 C++ 大师昨天告诉我,考虑到缓存未命中,大型执行程序中的任何虚函数调用都可能花费可变时间,我可以使用 C 风格的函数表查找和 gcc 热列表实现潜在的更好性能职能。但是,在上面提到的示例程序中,我仍然看到 2 倍的成本。
我的问题如下: 1. 上师的说法是真的吗?对于任何一个答案,有没有我可以参考的链接。 2. 有没有我可以参考的低延迟实现,有一个基类在派生类中调用自定义函数,使用函数指针? 3. 有什么改进设计的建议吗?
欢迎任何其他反馈。
【问题讨论】:
标签: c++ gcc class-design crtp low-latency