发送优化报告的选项优化报告在高层次上跟踪所有主要决策由编译器转换完成.例如,当内联决定将函数 foo() 内联到 bar() [...]我自己没有使用过这个,但根据文档,它可能对您的用例有用.每当生成的程序集很重要时,我都会亲自检查它.Can/does the compiler inline lambda functions to increase efficiency, as it might with simple standard functions?e.g.std::vector<double> vd;std::for_each(vd.begin(), vd.end(), [](const double d) {return d*d;});Or is there loss of efficiency caused by lack of optimisation?A second question: where I can check if the compiler I use has optimised calls of inline functions, which are sent to an algorithm? What I mean is, if a function—not a function object—is sent to an algorithm, the last one gets a pointer to the function, and some compilers optimize pointers to inline functions and others don't. 解决方案 In simple cases, like your example, you should expect better performance with lambdas than with function pointers, seeWhy can lambdas be better optimized by the compiler than plain functions?As others have already pointed out, there is no guarantee that your call will be inlined but you have better chances with lambdas. One way of checking whether the call has been inlined is to check the generated code. If you are using gcc, pass the -S flag to the compiler. Of course, it assumes that you can understand the assembly code.Update on Sep 11, 2018: Vipul Kumar pointed out two compiler flags in his edit.GCC -WinlineWarn if a function that is declared as inline cannot be inlined. Even with this option, the compiler does not warn about failures to inline functions declared in system headers.The compiler uses a variety of heuristics to determine whether or not to inline a function. For example, the compiler takes into account the size of the function being inlined and the amount of inlining that has already been done in the current function. Therefore, seemingly insignificant changes in the source program can cause the warnings produced by -Winline to appear or disappear.As I understand this, if your function is not declared inline, this compiler flag is most likely not helpful. Nevertheless it is good to know it exists and it partly answers your second question.The other flag that he pointed out is:Clang -Rpass=inlineOptions to Emit Optimization ReportsOptimization reports trace, at a high-level, all the major decisionsdone by compiler transformations. For instance, when the inlinerdecides to inline function foo() into bar() [...]I haven't used this one myself but based on the documentation it might be useful for your use case.I personally check the generated assembly whenever it is that important. 这篇关于lambda 是否像 C++ 中的函数一样内联?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
07-16 13:59
查看更多