Шаблонный класс и память
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 шт):
- Да, всегда. И зависит не от размера, а от сигнатуры - списка типов, с которыми создается.
intиunsigned intтоже по размеру не отличаются, но это разные типы с разным поведением и т.д. - Статическое поле будет создано для каждого инстанса шаблона. В вашем примере - 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);
Для каждого инстанса также будут сгенерированы конструкторы/деструкторы по-умолчанию. Этот сгенерированный код будет занимать место в вашем исполняемом файле и памяти при загрузке.
Это описано для общего случая. Есть вариации в случаях явного и неявного инстанцирования и реализации компилятором оптимизатора - но это тонкости.