Зависит от компилятора, но каждый, на кого я смотрел, создает функцию, которая затем вызывается с использованием параметров замещенного шаблона для генерации кода для каждого из вариантов.
в качестве (очень) простого примера:
template <typename T> T Max(T a, T b)
{
return a > b ? a : b;
}
, когда он вызывается как Max<int>
и Max<float>
и не встроен, компилятор генерирует (однако они оформлены специальным образом, чтобы избежать других проблем):
int Max(int a, int b)
{
return a > b ? a : b;
}
float Max(float a, float b)
{
return a > b ? a : b;
}
Затем он застревает в начале объекта, а затем на него ссылаются, затем то же самое делается для некоторых строк (в MSVC)