大佬教程收集整理的这篇文章主要介绍了C lambda会真正复制由副本捕获的参数吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
有了一个好的编译器,并假设我们不修改lambda函数中的值,我们是否可以希望一旦代码被编译和优化就没有实际的副本?
例如,在下面,将new_item作为值传递似乎是有意义的,因为它在只读模式下使用.
void loadavg_file::add(loadavg_item const & new_item) { auto const & it(std::find_if( f_items.begin(),f_items.end(),[new_item](auto const & item) { return (item.f_address == new_item.f_address); })); if(it == f_items.end()) { f_items.push_BACk(it); } else { // replace exisTing item with new avg and timestamp it->f_timestamp = new_item.f_timestamp; it->f_avg = new_item.f_avg; } }
循环是否会被优化并导致绝对没有new_item的副本?
这是因为您可能依赖于那些发生的副作用,而这不是允许复制省略的上下文;当从函数返回值时,只允许复制省略(并且,后来,强制要求).另一方面,允许在任何地方使用内存分配省略(根据[exPR.new] / 10中的规则); clang特别擅长这一点.
检查生成的程序集不算作副作用的观察,也不会在调试器中运行程序.
如果new_item的复制构造函数是非内联的,那么转换单元的程序集可能会将复制构造函数作为符号进行调用,但是如果链接时优化器可以,则链接时优化(LTO)仍然可以忽略该调用推断出复制构造函数没有可观察到的副作用.
以上是大佬教程为你收集整理的C lambda会真正复制由副本捕获的参数吗?全部内容,希望文章能够帮你解决C lambda会真正复制由副本捕获的参数吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。