假设我们有一个A类:
template<int N>
class A final{
public:
void foo() const { cout << N << endl; }
};
template<int N>
class A final{
public:
void foo() const { cout << N << endl; }
};
N
本身不会被存储在任何地方,它被编码成类型。从这个角度来看,模板特化A<1>
与非模板类A1
相同。对于A<2020>{}.foo()
,你可能会得到与std::cout << 2020
相同的汇编代码。当然,常量2020
必须被存储在某个地方,但它不会成为A<2020>{}
对象的一部分。
编译后,根据目标架构,A<2020>{}.foo()
可能看起来像这样(x86-64):
mov esi, 2020
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
这里N
直接放入寄存器中。
或者(ARM):
ldr r1, .L4
ldr r0, .L4+4
bl std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
...
.L4:
.word 2020
.word _ZSt4cout
这里的N
是从某个内存位置加载的。
A<2020>
实例的向量,2020
不会在内存中重复1'000'000次。 - Evg