让编译器为特定大小优化通用类(如模板)

时间:2015-12-25 15:30:49

标签: templates c++11 optimization

我编写了一个围绕任意大小的矩阵的类。我现在的问题是,虽然我很难在标题中清楚地表达它,但是是否有某种方法让编译器创建一个额外的版本,例如3X3或4X4矩阵,例如所有循环都将被优化掉。我的问题非常重要,所以如果有一些方法可以让编译器对那些流行的情况下的矩阵函数进行简并化,而不必像模板方法那样维护相同算法的3个版本,那就太棒了。

如果有人可以就此问题向我提出建议,我会很高兴,虽然我不认为它可以作为模板解决。

1 个答案:

答案 0 :(得分:0)

您可以为维度参数执行类似Eigen的操作:将它们设为模板参数,但为动态提供的值提供特殊值:

template <int N> struct X
{
    X() : data{} {}

    static std::size_t size() { return N; }

    int data[N];

    void compute() { for (int : data) { /* ... */ } }
};

template <> struct X<-1>
{
    X(int n) : len(n), data(n) {}

    std::size_t size() const { return data.size(); }

    std::vector<int> data;

    void compute() { for (int : data) { /* ... */ } }
};

公共代码可以移动到基类模板或基类中,例如使用CRTP:

template <typename D>
struct Compute
{
    void compute()
    {
        D & d = static_cast<D &>(*this);
        for (int n : d.get_data()) { /* do stuff with n */ }
    }
};

template <int N> struct X : Base<X>
{
    // as above
};

template <> struct X<-1> : Base<X>
{
    // as above
};