面试题答案
一键面试C++函数模板编译器自动实例化机制工作原理
- 模板定义阶段:编译器在遇到函数模板定义时,并不生成实际的函数代码。函数模板只是一个蓝图,描述了如何根据不同的模板参数生成具体的函数。
- 调用点实例化:当函数模板被调用时,编译器会根据调用时提供的实际参数来确定模板参数的具体类型。然后,编译器根据这些具体类型,从函数模板生成一个特定的函数实例,这个过程称为实例化。编译器为每个不同的模板参数组合生成独立的函数实例,就像手动编写了针对该类型的具体函数一样。
编译器自动实例化函数模板的情况
- 显式调用:当直接调用函数模板并提供实际参数时,编译器会自动实例化。例如:
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int result = add(3, 5); // 编译器自动实例化add<int>(int, int)
return 0;
}
在此例中,由于调用add(3, 5)
,编译器根据参数类型int
自动实例化出add<int>(int, int)
函数。
2. 地址获取:当获取函数模板的地址时,编译器也会实例化。例如:
template <typename T>
T multiply(T a, T b) {
return a * b;
}
void (*funcPtr)(int, int) = multiply; // 编译器自动实例化multiply<int>(int, int)
这里通过获取multiply
函数模板的地址并赋值给funcPtr
,编译器根据funcPtr
的类型自动实例化出multiply<int>(int, int)
。