Как использовать различную перегрузку встроенной функции, в зависимости от параметра времени компиляции? - PullRequest
3 голосов
/ 16 февраля 2011

У меня есть встроенная функция, критичная к производительности, inline T func(T a, T b, int p). Он может быть оптимизирован совсем немного, если известно, что p равно нулю. Тем не менее, я не могу использовать «если» и наказывать все остальные случаи. Я хочу оптимизировать только те функции, которые я знаю во время компиляции, что p равно нулю. Есть ли чистый способ сделать это, возможно, используя шаблон магии?

EDIT

Я не могу использовать перегрузки с разными именами функций / несовместимых (я не знаю, как правильно это выразить), поскольку код очень низкого уровня Весьма вероятно, что на других / будущих процессорах доступны разные возможности оптимизации. Таким образом, ограничивая весь этот низкоуровневый материал одной сигнатурой функции, мой код нужно только перекомпилировать для использования любого типа оптимизации.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2011

Вот еще один способ сделать это, если 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);
}

Специализация шаблона не возможна для функций, поэтому необходим класс-оболочка.

3 голосов
/ 16 февраля 2011

это возможно с помощью шаблонов. взгляните на Boost enable_if , он имеет хорошее объяснение и примеры использования

0 голосов
/ 17 февраля 2011

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
}

без потери производительности.

...