gpt4 book ai didi

c++ - lambda 捕获的新位置

转载 作者:太空狗 更新时间:2023-10-29 21:15:20 25 4
gpt4 key购买 nike

我有一个关于 C++ lambda 的有趣问题。用例是一个性能关键线程,它构造一个具有非空闭包的 lambda,然后将其传递给另一个线程,以便可以“处理”它。

总体思路可行,但我的 lambda 闭包对象被额外复制了一次,并且编译器(当前为 g++ 5.4.0)无法优化掉此拷贝,包括复制省略。我也尝试过类似的结果。

理想情况下,我希望在直接在持久内存中创建 lambda 对象时使用 new 放置,而不是首先在堆栈上创建对象,例如:

auto l = new (buf) [a,b,c](){}

错误是这样的:

lambda_ctor.cpp:39:19: error: expected type-specifier before '[' token
auto al = (buf) new [a,b,c](){};

我在想也许如果我手头有一个类型而不是实际的 lambda 表达式编译器应该接受它但是尝试提升闭包类型而不评估它会遇到另一个问题:

using T = decltype([a,b,c](){});

出现此错误:

lambda_ctor.cpp:41:24: error: lambda-expression in unevaluated context
using T = decltype([a,b,c](){});

我似乎找不到解决这个问题的方法,有很多关于如何防止 lambda 在作用域退出时解体的想法,但每个解决方案似乎都涉及在创建闭包对象后复制/移动它(又名额外拷贝)。这有点奇怪,因为通常我们可以完全控制如何创建和传递用户定义的仿函数,并且类似的规则应该适用于闭包。

最佳答案

auto 是你的 friend 。

auto l = new (buf) auto([a,b,c](){});

闭包对象的任何拷贝都应该是可省略的。

关于c++ - lambda 捕获的新位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38127290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com