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

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

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

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

但是,我们也可以只编写一个可以从 main 调用的非模板函数,而不是显式特化。 这将为我们节省一些处理时间,因为编译器会比显式专用模板函数更快地定位非模板函数,从而提高效率。

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

如有错误,请指正!

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

最佳答案

This would save us some processing time as the compiler would locate Global Functions faster than Explicitly Specialized Templated Functions which would in turn be better in terms of efficiency.

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

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

So why do we use Explicit Specialization when we have the alternative of just calling Global Functions?

一般情况下,对于函数模板,您不会使用显式特化,因为它通常会令人困惑且困难。 ISO C++ 标准有一个诗意的警告,要求在专门化函数模板时要极其谨慎。您可以阅读 Herb Sutter 的 "Why Not Specialize Function Templates?"详细解释这些问题以及为什么您不想专门化函数模板。

关于c++ - 函数模板 - 显式特化与全局函数 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3888058/

相关文章:

c++ - 编译器在错误时显示 'pi' 符号

c++ - 如何提高此 OpenCL Reduction Kernel 代码的性能?

java - 是否可以在运行时获取 lambda 参数的类型?

c++ - OpenGL 3.x/4x 中的纹素/像素匹配

c++ - 什么时候应该在模板函数中使用 typename?

ruby-on-rails - Angular + rails : ngInclude directive not working

c++ - 子类对象作为虚函数的参数

具有类型参数的类的 Scala 模式匹配

swift - 我怎样才能调用这个通用函数?

c++ - 枚举类型的运算符重载