函数模板 - 显式特化与全局函数(C ++)

时间:2010-10-08 06:01:32

标签: c++ templates generics function-templates explicit-specialization

我知道功能模板用于使功能可移植,因此可以与任何数据类型一起使用。

如果我们针对特定数据类型实施更高效的实施,也会完成模板的明确专业化

但是,我们还可以编写一个可以从main调用的非模板函数,而不是显式专精。 这将为我们节省一些处理时间,因为编译器会比明确专门的模板化函数更快地定位非模板函数,这在效率方面会更好。

那么,当我们只选择 Nontemplate Functions 时,我们为什么要使用 明确专业化 ?< / p>

请纠正我如果我错了!

编辑1: 我的教授告诉我,每当我们创建函数模板并从main调用函数时,编译器首先查找模板化函数,如果它无法找到它,那么它会搜索一个函数模板反过来创建一个模板化的函数然后调用它。

3 个答案:

答案 0 :(得分:4)

  

这将节省一些处理时间,因为编译器将比明确专门的模板化函数更快地定位全局函数,而这些函数在效率方面会更好。

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

在运行时(性能真的很重要,对吗?)调用函数模板实例化的性能应该不比调用nontemplate函数的性能好。

  

那么,当我们只选择调用全局函数时,为什么要使用显式专门化?

在一般情况下,对于函数模板,您不使用显式特化,因为它通常会令人困惑和困难。 ISO C ++标准具有诗意警告,在专门化功能模板时要非常谨慎。您可以阅读Herb Sutter的"Why Not Specialize Function Templates?"以获得对问题的详细解释以及您不希望专门化功能模板的原因。

答案 1 :(得分:1)

出于统一的原因。使用API​​的人只调用具有特定参数的方法,有些人获得泛型函数,其中一些获得显式专用函数 - 客户端既不需要知道也不关心他们使用哪些函数。

答案 2 :(得分:1)

听起来你的编译时效率与运行时效率相混淆。选择要在编译时调用哪个函数,而不是运行时,因此它对程序的运行时间没有影响。

如果您有特殊情况可以从特殊治疗中受益,则使用明确专业化。有时这会引起反击,如同std::vector<bool>的情况一样,而其他时候则非常方便。这意味着该功能的用户不需要知道有特殊情况;它只是透明的。