3

我有一个性能关键的内联函数,inline T func(T a, T b, int p). 如果已知 p 为零,则可以对其进行相当多的优化。但是,我不能使用“如果”来惩罚所有其他情况。我想要的只是优化我在编译时知道 p 为零的函数。有没有一种干净的方法可以做到这一点,也许使用模板魔法?

编辑

我不能使用不同命名的函数/不兼容的重载(我不知道如何正确表达),因为代码非常低级。很可能在另一个/未来的处理器上可以使用不同的优化机会。因此,通过将所有低级内容限制在一个函数签名中,我的代码只需重新编译即可使用任何类型的优化。

4

3 回答 3

3

如果 Boost 不满足,这是另一种方法。但是,p 参数必须是调用中的文字。

#include <iostream>

// Template this on the functions if you wanted this type templated:
typedef float T; 

template<int P>
struct Wrapper {
    static T func(T a, T b) {
        std::cout << "general case (p="<< P << ")\n";
        return (a+b)*P;
    }
};

// Template specialisation for P=0
template <>
struct Wrapper<0> {
    static T func(T a, T b) {
        std::cout << "p=0 case\n";
        return 0;
    }
};

#define func(A, B, P) \
    Wrapper<P>::func(A, B)

int main() {
    func(1,2,0);
    func(1,2,345);
}

函数无法进行模板特化,因此需要包装类。

于 2011-02-16T20:30:34.530 回答
3

可以使用模板。看看Boost enable_if,它有很好的解释和使用示例

于 2011-02-16T14:35:08.887 回答
0

GCC有一个__builtin_constant_p功能;GCC 文档中的更多信息。我相信你能拥有

inline T func(T a, T b, int p)
{
    if ( builtin_constant_p(p) && p==0 )
        // special case
    else
        // fallback
}

没有任何性能损失。

于 2011-02-16T21:52:03.927 回答