如何阻止C++ Lambda被内联?
如何阻止C++ Lambda被内联?
嘿,这个问题我做性能分析时可太有共鸣了!lambda一内联,调用栈直接乱成一锅粥,想定位具体哪个lambda在跑都难。给你分享几个亲测有效的办法:
直接给lambda加编译器的noinline属性
这是最直接的方式,不同编译器语法略有区别:
对于GCC/Clang,在lambda的参数列表后加__attribute__((noinline)):auto my_lambda = [&]() __attribute__((noinline)) { // 你的lambda逻辑 };对于MSVC,则用
__declspec(noinline):auto my_lambda = [&]() __declspec(noinline) { // 你的lambda逻辑 };这个方法针对性强,想阻止哪个lambda就给哪个加,缺点是依赖编译器扩展,跨平台的话要注意条件编译。
用一个noinline的包装函数包裹lambda
如果你不想每个lambda都加属性,可以写个通用的包装函数,把lambda转成“不可内联”的版本:template<typename Func> __attribute__((noinline)) auto make_noinline(Func&& f) { return std::forward<Func>(f); }用的时候直接把lambda传进去:
auto my_lambda = make_noinline([&]() { // 你的lambda逻辑 });因为包装函数本身标记了noinline,编译器会保留这个调用的层级,你的lambda调用就不会被直接内联到外层代码里了。
取lambda的地址再调用(简单但可靠性稍弱)
如果你不想折腾属性或包装函数,可以试试取lambda的地址,通过指针调用它:auto my_lambda = [&]() { /* 你的逻辑 */ }; auto lambda_ptr = &my_lambda; lambda_ptr->operator()();大多数编译器看到通过指针调用函数对象时,会放弃内联优化,但这个方法不如前两个可靠——如果编译器能确定指针指向的是哪个lambda,还是有可能把调用内联掉。
目前C++标准里还没有专门的语法来标记lambda不可内联,所以上面的方法都是基于编译器扩展或编译优化的特性,亲测在性能分析场景下足够用啦!
备注:内容来源于stack exchange,提问作者meisel
相关产品推荐
相关产品推荐

