我知道,如果我不能专业化,模板将无法在运行时占据内存。
例如:
//code 1
template<typename T>
class foo {
T val;
}
如果TypeName是int,则仅生成以下代码:
//code 2
template<typename T>
class foo {
int val;
}
代码1无法生成,因此代码不能在运行时占据内存。
现在我专业代码1
//code 3
template<>
class foo<double> {
double val;
}
代码3是否在运行时占据内存?
您可以使用https://godbolt.org/:
检查此类问题template<typename T>
struct foo {
foo(T v) : val(v) {}
T val;
};
template<>
struct foo<int> {
foo(int v) : val(v) {}
int val;
};
template<>
struct foo<double> {
foo(double v) : val(v) {}
double val;
};
int main() {
foo<int> a(5);
foo<short> b(10);
return a.val + b.val;
}
此代码与Clang(Trunk(-O0编译。输出为
main: # @main
push rbp
mov rbp, rsp
sub rsp, 16
mov dword ptr [rbp - 4], 0
lea rdi, [rbp - 8]
mov esi, 5
call foo<int>::foo(int)
lea rdi, [rbp - 16]
mov esi, 10
call foo<short>::foo(short)
mov eax, dword ptr [rbp - 8]
movsx ecx, word ptr [rbp - 16]
add eax, ecx
add rsp, 16
pop rbp
ret
foo<int>::foo(int): # @foo<int>::foo(int)
push rbp
mov rbp, rsp
mov qword ptr [rbp - 8], rdi
mov dword ptr [rbp - 12], esi
mov rax, qword ptr [rbp - 8]
mov ecx, dword ptr [rbp - 12]
mov dword ptr [rax], ecx
pop rbp
ret
foo<short>::foo(short): # @foo<short>::foo(short)
push rbp
mov rbp, rsp
mov qword ptr [rbp - 8], rdi
mov word ptr [rbp - 10], si
mov rax, qword ptr [rbp - 8]
mov cx, word ptr [rbp - 10]
mov word ptr [rax], cx
pop rbp
ret
您只能看到创建实际使用的方法。