2

我知道使用函数模板是为了使函数具有可移植性,以便它们可以与任何数据类型一起使用。

如果我们对特定数据类型有更有效的实现,那么模板的显式专业化也会完成。

但是,除了显式特化,我们也可以只编写一个可以main. 这将为我们节省一些处理时间,因为编译器会比显式专用模板函数更快地定位非模板函数,这反过来会在效率方面更好。

那么,当我们可以选择调用非模板函数时,为什么还要使用显式特化呢?

如果我错了,请纠正我!

编辑1: 我的教授告诉我,每当我们制作函数模板并从中调用函数时main,编译器首先会查找模板化函数,如果无法找到该函数,则它会依次搜索函数模板创建一个模板函数,然后调用它。

4

3 回答 3

4

这将为我们节省一些处理时间,因为编译器会比显式专用模板函数更快地定位全局函数,这反过来又会在效率方面更好。

为什么编译器会比函数模板特化更快地找到非模板函数?您是否对编译器性能进行了基准测试以验证此声明?如果您使用名为 的函数f,编译器总是必须编译一组候选函数并执行重载决策以确定要使用的正确函数。

在运行时(这是性能真正重要的时候,对吗?)调用函数模板实例化的性能应该不会比调用非模板函数的性能好。

那么,当我们可以选择只调用全局函数时,为什么还要使用显式特化呢?

在一般情况下,对于函数模板,您不使用显式特化,因为它通常令人困惑和困难。ISO C++ 标准有一个诗意的警告,即在特化函数模板时要格外小心。您可以阅读 Herb Sutter 的“为什么不专门化函数模板?” 以获得对问题的良好解释以及为什么您不想专门化功能模板。

于 2010-10-08T06:23:39.393 回答
1

出于统一的原因。使用 API 的人只需调用具有特定参数的方法,一些获取通用函数,一些获取明确的专用函数——客户端不需要知道也不需要关心他们使用哪个。

于 2010-10-08T06:09:26.583 回答
1

听起来您将编译时效率与运行时效率混淆了。调用哪个函数的选择是在编译时做出的,而不是在运行时进行的,因此对程序的运行时间没有影响。

当您有可以从特殊处理中受益的特殊情况时,使用显式专业化。有时这会适得其反,例如std::vector<bool>,而其他时候它非常方便。这意味着函数的用户不需要知道有特殊情况;它只是透明的。

于 2010-10-08T21:17:53.483 回答