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

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
}

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

2 ответа

Решение

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

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).

Дано;

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 компилируется как обычная функция и выполняется во время выполнения для определения результата. Это имеет значение во время выполнения. Смотрите здесь для листинга кода.

Другие вопросы по тегам