2013-02-25 2 views
0

Я использую мета-программирование некоторых шаблонов для решения небольшой проблемы, но синтаксис немного раздражает - поэтому мне было интересно, что в приведенном ниже примере будут перегружены операторы на мета- класс, который имеет пустой конструктор, вызывает ограничение производительности (времени выполнения)? Будут ли созданы все временные периоды или можно предположить, что они будут оптимизированы?Перегрузка операторов с помощью шаблонов метапрограммирования C++

template<int value_> 
struct Int { 
    static const int value = value_; 

    template<typename B> 
    struct Add : public Int<value + B::value> { }; 

    template<typename B> 
    Int<value + B::value> operator+(B const&) { return Int<value + B::value>(); } 
}; 

int main() 
{ 
    // Is doing this: 
    int sum = Int<1>::Add<Int<2> >().value; 

    // any more efficient (at runtime) than this: 
    int sum = (Int<1>() + Int<2>()).value; 

    return sum; 
} 
+0

'Int <1> :: Добавить >(). Значение' может быть переписано как' Int <1> :: Добавить > :: значение'. – Nawaz

+0

Ох. Кажется, я создаю [шаблоны выражения] (http://stackoverflow.com/a/2598596/21475), даже не зная об этом. Кажется, оптимизаторы очень хорошо справляются с такими вещами! – Cameron

+0

@Nawaz: Вы правы, конечно, это артефакт дизайна моего реального кода (который в конечном итоге нуждается в экземпляре во время выполнения). – Cameron

ответ

0

Сравните ассемблерный код, сгенерированный g ++ -O3 -S для обоих решений. Он дает одинаковый код для обоих решений. Он фактически оптимизирует код, чтобы просто вернуть 3.

+0

Да, просто сделал это. Благодаря :-) – Cameron

2

Хорошо, я попробовал свой пример под GCC.

Для версии Add без оптимизации (-O0) результирующая сборка просто загружает константу в сумму, а затем возвращает ее.

Для версии operator+ без оптимизации (-O0) результирующая сборка немного больше (по-видимому, она вызывает operator+).

Однако с -O3 обе версии генерируют ту же самую сборку, которая просто загружает 3 непосредственно в регистр возврата; временные, функциональные вызовы и sum были полностью оптимизированы в обоих случаях.

Итак, они одинаково быстрые с достойным компилятором (при условии, что оптимизация включена).

Смежные вопросы