Шаблонный класс и память

1)Всегда ли инстанс шаблонного класса занимает место в памяти?

template<class A>
class C{};

C<int> c1; 
C<double> c2; 

Я говорю не о памяти выделенной для объекта, а памяти которую занимает класс (его статические поля, методы). Ведь на сколько я знаю типы существуют только на этапе компиляции. И код

int a = 10;

и

class INT {int a = 10;}
INT i;

По размеру не будут отличаться. Наличие опредления класса в исходном коде не изменит размер исполняемого файла.

2)Занимает ли память каждая инстанс шаблонного класс в котором есть статические поля?

template<class A>
class C{static constexpr int i = sizeof(A);};
    
C<int> c1;
C<double> c2; 

Занимают ли место в памяти функции-члены шаблонного класса, шаблонные классы использует одни и те же функции-члены для своих инстанс или нет?

template<class A>
class C{public: A fuu(A a){return a;}};
    
C<int> c1;
C<double> c2; 

Ответы (1 шт):

Автор решения: DmitryK
  1. Да, всегда. И зависит не от размера, а от сигнатуры - списка типов, с которыми создается. int и unsigned int тоже по размеру не отличаются, но это разные типы с разным поведением и т.д.
  2. Статическое поле будет создано для каждого инстанса шаблона. В вашем примере - 2 статических переменных. При этом размер объекта класса будет равен 1 байт - требование стандарта. По замечанию @Mikhailo - объект пустого класса имеет ненулевой размер.
    А вот код функций сгенерируется для обоих инстансов. Для вашего шаблона:
template<class A>
class C
{ 
    static constexpr int i = sizeof(A);
    A fuu(A a) {return a;}    
};

C<int> c1;
C<double> c2; 

будет сгенерировано

static constexpr int C<int>::i;
static constexpr int C<double>::i;

C<int>::fuu(int a);
C<double>::fuu(double a);

Для каждого инстанса также будут сгенерированы конструкторы/деструкторы по-умолчанию. Этот сгенерированный код будет занимать место в вашем исполняемом файле и памяти при загрузке.

Это описано для общего случая. Есть вариации в случаях явного и неявного инстанцирования и реализации компилятором оптимизатора - но это тонкости.

→ Ссылка