C++ lambda 生命周期
C++ lambda lifecycle
在下面的代码中,运行时会发生什么?
while ( ([]()->bool { return something(); })() ) {
...
}
- lambda 实例仅创建一次,并在后续迭代中重复使用。
- 每次迭代都会创建一个新实例,该实例仅使用一次。
- 以上都不是(请解释)。
最初对我来说很明显,它在每次迭代中都会重新创建,但我想知道编译器是否进行了某种优化。
首先是几个标准引号,我的重点是:
[标准同时]/1
在 while 语句中,子语句重复执行,直到 条件的值 ([stmt.select]) 变为 false。测试内容 在每次执行子语句之前发生。
[expr.prim.lambda]/2
lambda 表达式是一个 prvalue,其结果对象称为 闭包对象。
上面告诉 USE 在每次迭代之前都会评估([]()->bool { return something(); })()
。并且子表达式[]()->bool { return something(); }
创建一个 prvalue。因此,只有在评估完整表达时,它才会栩栩如生。
因此,法律的干巴巴的文字表明它是闭包类型的不同对象,每次评估条件时都会被构建和破坏。
但编译器并不愚蠢。我相信,在 as-if 规则下,它很可能会被优化为对something()
的直接调用。这是因为 lambda 的构建和破坏没有可观察到的副作用。
如果我们确实使用像godbolt在线编译器查看器这样的工具,我们看到GCC 7.2 at-O1
将直接调用该函数。Clang 5.0也是如此,但我必须进行优化才能-O2
实现这一目标。
相关文章:
- 如何在共享库的整个生命周期内存储数据
- 如何理解句子的生命周期始于对e的评估
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- Go/C++gRPC客户端通道和存根生命周期
- 如何将"this"的生命周期移动到C++中的另一个对象中?
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 使用对象的生命周期作为设置器的安全性
- 临时人员的生命周期传递给函数
- 我想知道在构造函数中初始化变量时的生命周期
- Lua 用户数据生命周期管理
- 如何使用 epoll(void* event.data.ptr) 管理 Connection 的生命周期
- C++引用的生命周期
- 在堆栈上有一个对象,而不是在函数的整个生命周期内
- 在 Boost ASIO 服务器中处理生命周期
- C++ lambda 生命周期
- 使用互斥锁跟踪另一个应用的生命周期
- QSharedPointer 或 std::shared_ptr 的生命周期
- 来自async_resolve的 boost::asio::ip::tcp::resolver::iterator 的生命周期是多久?
- 如何调整属于类的唯一指针的字符数组的大小.它必须在程序的整个生命周期中保持活力
- 延长 std::tuple<int&,int> 的生命周期,方法是将其分配给 const std::tuple<int, int>&