3

パフォーマンスが重要なインライン関数がありinline T func(T a, T b, int p)ます。pがゼロであることがわかっている場合は、かなり最適化できます。ただし、「if」を使用して他のすべてのケースにペナルティを課すことはできません。私が欲しいのは、コンパイル時にpがゼロであることを知っているだけの関数を最適化することです。テンプレートマジックを使用して、それを行うためのクリーンな方法はありますか?

編集

コードが非常に低レベルであるため、別の名前の関数/互換性のないオーバーロードを使用することはできません(それを正しく表現する方法がわかりません)。別の/将来のプロセッサでさまざまな最適化の機会が利用できる可能性が非常に高いです。したがって、これらすべての低レベルのものを1つの関数シグネチャに限定することで、コードを再コンパイルするだけで、あらゆるタイプの最適化を使用できます。

4

3 に答える 3

3

テンプレートを使用することが可能です。Boost enable_ifを見てください、それは良い説明と使用例を持っています

于 2011-02-16T14:35:08.887 に答える
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 に答える
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 に答える