Вызывают ли концепции С++ создание экземпляров шаблонов для создания выходных данных?
Мне кажется, что для библиотек со многими большими и сложными экземплярами шаблонов одним из основных соображений при принятии решения об использовании концепций будет уменьшение размера выходных данных сборки.
Я понимаю, что с SFINAE следующий код вызовет создание экземпляров шаблона
std::is_function<bar>
а также
std::enable_if<true, bool>
для включения в вывод сборки, увеличивая его размер (хотя и незначительно для этого примера):
#include <type_traits>
template<typename F,
typename = std::enable_if_t<
std::is_function<F>::value,
bool> = true>
void foo(F& f)
{
// do some stuff with f
}
void g();
int main()
{
foo(g);
return 0;
}
Если концепция C++20, основанная на
std::is_function
вместо этого используется шаблон, очевидно, для его проверки необходимо создать экземпляр шаблона. Но записывается ли этот экземпляр затем в окончательный вывод сборки? И зависит ли это от реализации компилятора?
#include <type_traits>
template<typename F>
concept Function = std::is_function<F>::value;
template<Function F>
void foo(F& f)
{
// do some stuff with f
}
//...
1 ответ
Кажется, вы беспокоитесь о размере кода.
Классы, и здесь я включаю экземпляры шаблонов классов, являются просто абстрактными фрагментами информации, о которых знает компилятор. Они не влияют на размер кода.
Только функции, включая функции-члены, влияют на размер кода. Функции-члены шаблонов классов вносят вклад в размер кода только тогда, когда они созданы, потому что этого требует способ их использования (стандарт C++ называет это « используемым ODR »).
В ваших примерах нет функций-членов
std::is_function
а также
std::enable_if
используются ODR, поэтому они не создаются и не влияют на размер кода.
Но записывается ли этот экземпляр затем в окончательный вывод сборки?
Код не генерируется. Но обычно компиляторы записывают отладочную информацию в вывод. В этом смысле что-то записывается на выходе.
И зависит ли это от реализации компилятора?
Что касается отладочной информации: да. Но то, происходит ли создание экземпляра, регулируется правилами языка, и между компиляторами не должно быть различий.