use*_*484 58 c++ function-pointers inlining function-object
根据Scott Meyers的说法,C++在C上闪耀的一个领域是函数对象比函数指针更快.他说这是因为函数对象是内联的,这会提高速度.
我有两个问题:
我们如何验证函数对象实际上是内联的?我们能否在实践中验证这一点?
函数对象的内联是否依赖于我们使用的编译器,还是所有编译器的行为都是这样的?
Yak*_*ont 76
C++和C标准为编译器留下了一大堆自由.编译器可以在每条指令之间自由计数到10亿,或者只有在整数具有素数值时才能这样做.
体面的"真实"编译器不这样做.这是一个实施质量问题.
将函数对象内联到类似于std::sort每个真正的编译器所做的事情.在这些情况下检测需要内联的内容非常容易,因为类型信息带有需要内联的代码.
使用函数指针这样做更难.使用函数指针执行此操作,其中所有内容都已转换为void*或char*指针更难.
这样做的结果是,在实践中,qsort对C++风格的调用进行C风格的调用std::sort可以带来很大的优势std::sort.
qsort大致2倍慢于std::sort,如图这里,在分选随机排列整数可笑的简单情况.
检查实际的汇编代码输出主要是一个细节,并且很少有回报.通过具体的实际示例,您可以了解实际影响有多大.
clang,gcc和MSVC中的所有3个能够std::sort显着快于他们的速度qsort.由于这是一个简单的优化,虽然优化函数指针到内联调用不是,你期望较少的主要编译器不比这更好qsort.
πάν*_*ῥεῖ 18
- 我们如何验证函数对象实际上是内联的?我们能否在实践中验证这一点?
当然,检查最终发出的汇编程序代码.
- 内联函数对象取决于我们使用的编译器,或者所有编译器的行为都是这样的?
它在很大程度上取决于编译器实现和使用的优化级
所以不,不能保证特定的编译器(链接器)表现如此.
但是,通过函数指针调用不能内联.
根据他的说法,函数对象是内联的,因此速度会有所提高.
IMO "内联函数对象"应该更好地阅读(或听到,我不知道该引用的来源):
通过函数指针调用时,函数对象可以内联.