【发布时间】:2016-08-09 17:30:17
【问题描述】:
在 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 的副本?
【问题讨论】:
-
没有保证。一个好的编译器可能优化掉副本,但这不是必需的。
-
您唯一知道的就是代码必须像以前那样运行。如果内联整个事物与不制作副本/对象与您编写的内容之间没有区别,那么编译器可以做到这一点。会吗?编译它并检查程序集。
-
这个问题对我来说似乎比其他两个评论者更有趣。 AFAIK,编译器只允许在某些条件下删除副本,我不知道 lambda 捕获是否是其中之一。 (当副本微不足道时,这并不重要,但 OP 可能不在乎副本是否微不足道。)
-
@m.s.这也可能取决于
loadavg_item的数据成员的类型。如果它们都是平凡的类型怎么办?无法确定编译器是否总是会创建副本。无论如何,我不清楚为什么 OP 首先没有通过引用捕获new_item。 -
@Praetorian,我们无法判断编译器是否会始终遵循某种优化,但我们可以确定是否至少允许这种优化。我绝对愿意被影响,但现在,我并不清楚它是。
标签: c++ lambda language-lawyer compiler-optimization