Накладные расходы на переменный шаблон

C ++ 14 представил шаблоны переменных (Шаблоны переменных).

template<class T>
constexpr T pi = T(3.1415926535897932385);  // variable template

template<class T>
T circular_area(T r) // function template
{
return pi<T> * r * r; // pi<T> is a variable template instantiation
}

Каковы издержки использования этого, как с точки зрения объема двоичной памяти и скорости во время выполнения?

1

Решение

Я определенно сообщу об этом как об ошибке производителю компилятора, если есть ЛЮБОЕ различие между:

template<class T>
constexpr T pi = T(3.1415926535897932385);  // variable template

template<class T>
T circular_area(T r) // function template
{
return pi<T> * r * r; // pi<T> is a variable template instantiation
}

а также

constexpr double pi = 3.1415926535897932385;

double circular_area(double r)
{
return pi * r * r;
}

И то же самое, если вы замените double с float,

В общем, constexpr следует оценивать до соответствующей константы прямо в скомпилированном коде. Если он не может этого сделать, то компилятор должен выдать ошибку (потому что это не правда constexpr).

5

Другие решения

Дано;

template<class T>
constexpr T pi = T(3.1415926535897932385); // when T is double
// and
constexpr double pi = 3.1415926535897932385;

Разницы во времени выполнения нет, они обе являются константами времени компиляции. Шаблоны — вещь времени компиляции — как таковая, когда сравнивается как с подобным (т.е. constexpr double pi против constexpr T pi) это закончилось бы тем же самым — это ожидается.

Что отличается от кода OP, так это то, как он используется.

template<class T>
T circular_area_t(T r) // function template
{
return pi<T> * r * r; // pi<T> is a variable template instantiation
}
// and
constexpr double circular_area_1(double r)
{
return pi<double> * r * r;
}
double circular_area_2(double r)
{
return pi<double> * r * r;
}

Учитывая constexpr функция circular_area_1 и функция шаблона circular_area_t, оба из них приводят к вычислениям времени компиляции, следовательно, литералы в двоичном коде результата. Затем на-constexpr функция circular_area_2 компилируется как обычная функция и выполняется во время выполнения для определения результата. Это имеет значение во время выполнения. Увидеть здесь для перечисления кода.

0

По вопросам рекламы [email protected]