仿函数实际上比指向函数的速度快吗?

根据Scott Meyers的说法,C ++在C上的一个领域是函数对象比函数指针快。 他说这是因为函数对象是内联的,这会提高速度。

我有两个问题:

  1. 我们如何validation函数对象实际上是内联的呢? 我们可以在实践中validation这个吗?

  2. 函数对象的内联取决于我们使用的编译器,还是所有的编译器都像这样?

C ++和C标准给编译器留下了一堆自由。 编译器可以在每条指令之间自由计数到10亿,或者只有当一个整数具有一个整数值时才可以这样做。

体面的“真正的”编译器不这样做。 这是一个实施质量问题。

将函数对象内联到std::sort是每个真正的编译器所做的事情。 在这些情况下检测需要内联的内容是非常容易的,因为types信息带有需要内联的代码。

用函数指针这样做更难。 这样做的一个函数指针,一切都被转换为void*char*指针更难。

这样做的效果是,实际上,一个C风格调用qsort vs C ++风格的调用std::sort可以为std::sort带来很大的好处。

qsortstd::sort要慢大约2 qsort ,正如这里所示的,在sorting随机排列的整数的荒谬简单的情况下。

检查实际的汇编代码输出主要是一个细节,很less有回报的工作。 以具体的现实世界的例子给你一个这个影响到底有多大的概念。

叮,gcc和MSVC中的所有3,可以使std::sort显着快于qsort 。 因为这是一个简单的优化,而优化函数指针到内联调用不是,你会期望更less的主要编译器不会比在qsort更好。

  1. 我们如何validation函数对象实际上是内联的? 我们可以在实践中validation这个吗?

当然,检查最终发布的汇编代码。

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

它很大程度上取决于使用的编译器实现和优化级别
所以不,不能保证特定的编译器(链接器)的行为。

尽pipe通过函数指针调用不能被内联。


据他介绍,函数对象是内联的,所以速度有所提高。

国际海事组织“function对象内联”应更好地阅读(或听说,我不知道从哪里来的):

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

是的,函数对象可能会导致更快的代码。 但要确保这是唯一的基准。

  1. 该文档说:“ GCC可能仍然无法内联函数的原因很多; -Winline选项可能被用来确定一个函数是否没有内联,为什么不。

  2. 当然,这取决于编译器,版本,标志等。有时内联可能会适得其反(代码膨胀等),所以每个编译器都有自己的一套规则来决定函数是否应该内联。 顺便说一句, inline关键字只是一个提示,而像eigen这样的一些库很难实现内联。