加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C lambda会真正复制由副本捕获的参数吗?

发布时间:2020-12-16 10:03:39 所属栏目:百科 来源:网络整理
导读:在C中使用lambda函数和由值捕获的变量意味着 copy of the value. 有了一个好的编译器,并假设我们不修改lambda函数中的值,我们是否可以希望一旦代码被编译和优化就没有实际的副本? 例如,在下面,将new_item作为值传递似乎是有意义的,因为它在只读模式下使用.
在C中使用lambda函数和由值捕获的变量意味着 copy of the value.

有了一个好的编译器,并假设我们不修改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的副本?

解决方法

如果new_item的复制构造函数(即loadavg_item :: loadavg_item(loadavg_item const&))具有除了内存分配之外的可观察效果,??则必须观察到这些影响(只要你知道,你实际上是在努力观察他们).

这是因为您可能依赖于那些发生的副作用,而这不是允许复制省略的上下文;当从函数返回值时,只允许复制省略(并且,后来,强制要求).另一方面,允许在任何地方使用内存分配省略(根据[expr.new] / 10中的规则); clang特别擅长这一点.

检查生成的程序集不算作副作用的观察,也不会在调试器中运行程序.

如果new_item的复制构造函数是非内联的,那么转换单元的程序集可能会将复制构造函数作为符号进行调用,但是如果链接时优化器可以,则链接时优化(LTO)仍然可以忽略该调用推断出复制构造函数没有可观察到的副作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读