На самом деле это полностью зависит от компилятора. Требуется только сгенерировать правильный код для своих входов. Для этого он должен следовать стандарту C ++, поскольку он объясняет, что является правильным. В этом случае говорится, что компилятор должен на одном шаге процесса создать шаблоны с разными аргументами в виде разных типов, позже эти типы могут быть представлены одним и тем же кодом или нет, это полностью зависит от компилятора.
Наиболее вероятно, что компилятор включит по крайней мере MaxLength (), но, возможно, и ваш ctor. В противном случае он вполне может сгенерировать один экземпляр вашего ctor и передать / заставить его извлечь S из другого места. Единственный способ узнать наверняка - это проверить вывод компилятора.
Итак, чтобы знать наверняка, я решил перечислить, что VS2005 делает в сборке релиза. Скомпилированный файл выглядит следующим образом:
template <int S>
class A
{
char s_[S];
public:
A()
{
for(int i = 0; i < S; ++i)
{
s_[i] = 'A';
}
}
int MaxLength() const
{
return S;
}
};
extern void useA(A<5> &a, int n); // to fool the optimizer
extern void useA(A<25> &a, int n);
void test()
{
A<5> a5;
useA(a5, a5.MaxLength());
A<25> a25;
useA(a25, a25.MaxLength());
}
Вывод ассемблера следующий:
?test@@YAXXZ PROC ; test, COMDAT
[snip]
; 25 : A<5> a5;
mov eax, 1094795585 ; 41414141H
mov DWORD PTR _a5$[esp+40], eax
mov BYTE PTR _a5$[esp+44], al
; 26 : useA(a5, a5.MaxLength());
lea eax, DWORD PTR _a5$[esp+40]
push 5
push eax
call ?useA@@YAXAAV?$A@$04@@H@Z ; useA
Как видите, как ctor, так и вызов MaxLength () встроены. И как вы теперь можете догадаться, он делает то же самое с типом A <25>:
; 28 : A<25> a25;
mov eax, 1094795585 ; 41414141H
; 29 : useA(a25, a25.MaxLength());
lea ecx, DWORD PTR _a25$[esp+48]
push 25 ; 00000019H
push ecx
mov DWORD PTR _a25$[esp+56], eax
mov DWORD PTR _a25$[esp+60], eax
mov DWORD PTR _a25$[esp+64], eax
mov DWORD PTR _a25$[esp+68], eax
mov DWORD PTR _a25$[esp+72], eax
mov DWORD PTR _a25$[esp+76], eax
mov BYTE PTR _a25$[esp+80], al
call ?useA@@YAXAAV?$A@$0BJ@@@H@Z ; useA
Очень интересно посмотреть, как хитрый компилятор оптимизирует цикл for. Для всех этих преждевременных оптимизаторов, использующих memset (), я бы сказал, что вы дурак.
Как это будет вести себя, если я перенесу определение A и Maxlength в другой файл cpp.
Вероятно, он не скомпилируется (если только вы не используете A в этом cpp-файле).