首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >函数器真的比指向函数的指针快吗?

函数器真的比指向函数的指针快吗?
EN

Stack Overflow用户
提问于 2016-11-26 01:27:53
回答 3查看 5.4K关注 0票数 60

根据Scott Meyer的说法,C++优于C语言的一个方面是函数对象比函数指针更快。他说,这是因为函数对象是内联的,这提高了速度。

我对此有两个问题:

  1. 我们如何验证函数对象实际上是内联的?我们能在实践中验证这一点吗?
  2. 函数对象的内联取决于我们使用的编译器,还是所有编译器都是这样的?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-26 01:36:39

C++和C标准给编译器留下了很大的自由度。编译器可以自由地在每条指令之间计数到10亿,或者只有在整数中有质数时才这样做。

像样的“真正的”编译器不会这样做。这是一个实现质量问题。

将函数对象内联到像std::sort这样的东西中是每个真正的编译器都会做的事情。在这些情况下,检测需要内联的内容非常容易,因为类型信息包含需要内联的代码。

使用函数指针来实现这一点比较困难。在函数指针中,所有内容都被转换为void*char*指针,这样做就更难了。

这样做的效果是,在实践中,对qsort的C风格调用与对std::sort的C++风格调用相比,可以为std::sort带来巨大的优势。

在对随机排列的整数进行排序的荒唐简单的情况下,qsort大约比std::sort慢2倍,如here所示。

检查实际的汇编代码输出主要是一个细节,这是一个很大的工作,回报很少。以具体的现实世界为例,可以让你了解影响到底有多大。

clang,gcc和微软的3个人都能使std::sort明显快于他们的qsort。由于这是一个简单的优化,而优化内联调用中的函数指针却并非如此,在qsort中,您可能会期望较少的主要编译器比这更好。

票数 77
EN

Stack Overflow用户

发布于 2016-11-26 01:31:07

  1. 我们如何验证函数对象实际上是内联的?我们能在实践中验证这一点吗?

当然,请检查最终发出的汇编程序代码。

  1. 内联函数对象取决于我们使用的编译器,或者所有编译器都是这样运行的?

这在很大程度上取决于编译器的实现和使用的优化级别。

因此,不能保证特定的编译器(链接器)会这样做。

但是,通过函数指针的调用不能内联。

根据他的说法,函数对象是内联的,因此速度有所提高。

IMO“函数对象是内联的”最好读一读(或者听一听,我不知道这句话从何而来):

函数对象可以是内联,而通过函数指针的调用则不能。

票数 18
EN

Stack Overflow用户

发布于 2016-11-30 04:21:13

是的,函数对象可能会导致更快的代码。但确保这一点的唯一方法是进行基准测试。

  1. The documentation说:“由于许多原因,GCC可能仍然无法内联一个函数;可以使用-Winline选项来确定函数是否尚未内联,以及为什么没有内联。”
  2. 当然,这取决于编译器、版本、标志等。有时内联可能会适得其反(代码膨胀等),因此每个编译器都有自己的一组规则来决定函数是否应该内联。顺便说一下,inline关键字只是一个提示,像eigen这样的一些库很难执行内联。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40809985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档