在减少模板使用的同时优化性能

时间:2013-03-09 11:07:26

标签: c++ templates

在我的应用程序中,我通过为结构引入特殊情况获得了大约2倍的加速。

简化,我的代码如下:

class SpecialCase
{
   private:
      size_t values[10];
   public:
      void foo();
};

class GenericCase
{
   private:
      std::vector<size_t> values;
   public:
      void foo();
};

template <class Case> void bar()
{
   Case case;
   case.foo();
}

void somewhereElse()
{
   if ( boring_runtime_condition )
   {
      bar<SpecialCase>();
   }
   else
   {
      bar<GenericCase>();
   }
}

这段代码没有问题,但现在我必须通过另一个类扩展应用程序:

class Problem
{
   private:
      std::vector<Case> cases;
   public:
      Case doSomething();
};

要使用SpecialCase和GenericCase,我必须使整个类成为模板。由于我有几个特殊情况,这大大减慢了编译速度。我根本不喜欢这样。

我从不在应用程序的运行中混合使用SpecialCase和GenericCase。我非常希望不必将我的Case转换为每个方法中的特定类型,因为它会使代码膨胀,而其他开发人员可能会忘记它。

有没有一种避免这种模板疯狂的好方法? (也欢迎C ++ 11解决方案)

免责声明:请不要告诉我std::vector有多棒,我不应该使用特殊情况。我测量了性能,所以请不要发表你不相信加速2倍的评论。这是事实,而这个问题与此无关。

1 个答案:

答案 0 :(得分:0)

如果您不想创建std::vector的大量实例,则可以创建一个小型代理类,通过引用存储所有内容,并仅在此类中进行转换。如果它很小,实例化不会太慢。

template<class T>
class Problem {
    private:
        std::vector< some_smart_pointer > cases;
    public:
        T cast(Case* x) {
             return (T*)x;
        }
        T doSomething() {
             //doing something
              return cast(returnValue);
        }
};

我致电课程Problem,但最好还是制作一些仅用作代理的其他图层ProxyVector并在Problem中使用