Вызывают ли концепции С++ создание экземпляров шаблонов для создания выходных данных?

Мне кажется, что для библиотек со многими большими и сложными экземплярами шаблонов одним из основных соображений при принятии решения об использовании концепций будет уменьшение размера выходных данных сборки.

Я понимаю, что с 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, поэтому они не создаются и не влияют на размер кода.

Но записывается ли этот экземпляр затем в окончательный вывод сборки?

Код не генерируется. Но обычно компиляторы записывают отладочную информацию в вывод. В этом смысле что-то записывается на выходе.

И зависит ли это от реализации компилятора?

Что касается отладочной информации: да. Но то, происходит ли создание экземпляра, регулируется правилами языка, и между компиляторами не должно быть различий.

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