根据Scott Meyer的说法,C++优于C语言的一个方面是函数对象比函数指针更快。他说,这是因为函数对象是内联的,这提高了速度。
我对此有两个问题:
发布于 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
中,您可能会期望较少的主要编译器比这更好。
发布于 2016-11-26 01:31:07
当然,请检查最终发出的汇编程序代码。
这在很大程度上取决于编译器的实现和使用的优化级别。
因此,不能保证特定的编译器(链接器)会这样做。
但是,通过函数指针的调用不能内联。
根据他的说法,函数对象是内联的,因此速度有所提高。
IMO“函数对象是内联的”最好读一读(或者听一听,我不知道这句话从何而来):
函数对象可以是内联,而通过函数指针的调用则不能。
发布于 2016-11-30 04:21:13
是的,函数对象可能会导致更快的代码。但确保这一点的唯一方法是进行基准测试。
-Winline
选项来确定函数是否尚未内联,以及为什么没有内联。”inline
关键字只是一个提示,像eigen这样的一些库很难执行内联。https://stackoverflow.com/questions/40809985
复制相似问题