面试题答案
一键面试- 常见影响性能因素:
- 代码膨胀:当函数模板针对不同类型实例化时,会生成多个函数副本,导致可执行文件增大。例如,定义一个简单的函数模板
template <typename T> void add(T a, T b) { return a + b; }
,如果在程序中分别用int
、double
等不同类型调用该模板函数,编译器会为每种类型生成一个add
函数的副本。 - 不必要的类型转换:在模板函数参数传递和返回值过程中,如果类型不匹配,可能会发生不必要的类型转换,这会消耗额外的性能。比如模板函数
template <typename T> T multiply(T a, T b) { return a * b; }
,若调用时传入int
类型和double
类型,int
类型会被转换为double
类型进行计算,返回时如果接收变量是int
类型,又可能发生截断转换。
- 代码膨胀:当函数模板针对不同类型实例化时,会生成多个函数副本,导致可执行文件增大。例如,定义一个简单的函数模板
- 避免代码膨胀的方法:
- 显式实例化:在源文件中显式实例化特定类型的模板函数,这样编译器就不会在每个调用点都生成函数副本。例如:
template <typename T> void add(T a, T b) { return a + b; }
// 显式实例化 int 类型的 add 函数
template void add<int>(int a, int b);
在其他源文件中调用 add<int>
时,编译器就不会再次生成 add<int>
的副本,从而避免代码膨胀,减少可执行文件大小。