C++ STL sort()第三个参数:仿函数为何比内联函数更快?
为什么仿函数版本的排序比内联函数指针更快?
这种性能差异确实是编译器优化策略导致的,核心在于函数指针和仿函数在模板实例化时的处理逻辑完全不同,具体原因可以拆成这几点:
函数指针的内联限制:
哪怕你把mycmp声明为inline,当它以指针形式传给std::sort时,编译器几乎没法把它真正内联到排序的核心循环里。因为std::sort是模板函数,传入函数指针后,会实例化出一个通用版本——这个版本需要兼容所有符合签名的函数指针,编译器没法确定你传入的指针在运行时会不会指向其他函数(哪怕你实际只传了mycmp),所以只能生成通过指针间接调用的代码,这就带来了固定的函数调用开销,也没法做上下文相关的优化。仿函数的优化友好性:
仿函数是一个具体的类类型,std::sort会针对这个类型专门实例化模板。编译器在处理时,能直接访问到mycmp2::operator()的完整代码,完全可以把这段比较逻辑直接内联到排序的循环中,消除了函数调用的开销。甚至还能结合排序的场景做更激进的优化,比如调整指令顺序、消除冗余判断,这些都是函数指针版本很难享受到的。全程序优化的影响:
如果开启全程序优化(比如GCC的-flto、MSVC的/LTCG),函数指针版本的性能可能会接近仿函数——因为编译器能看到整个程序的代码,确定这个指针只会指向mycmp,从而做内联优化。但在默认的优化等级下,仿函数的优势会非常明显。
内容的提问来源于stack exchange,提问作者xf h
相关产品推荐
相关产品推荐

