Ale*_*lke 3 c++ lambda compiler-optimization language-lawyer
在C++中使用lambda函数和由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;
}
}
Run Code Online (Sandbox Code Playgroud)
循环是否会被优化并导致绝对没有副本new_item?
如果new_item(ie loadavg_item::loadavg_item(loadavg_item const&))的复制构造函数具有除记忆分配之外的可观察效果,则必须观察到这些效应(只要你知道,你实际上是在努力观察它们).
这是因为您可能依赖于那些发生的副作用,而这不是允许复制省略的上下文; 当从函数返回值时,只允许复制省略(并且,后来,强制执行).另一方面,允许在任何地方使用内存分配省略(根据[expr.new]/10中的规则); clang特别擅长这一点.
检查生成的程序集不算作副作用的观察,也不会在调试器中运行程序.
如果复制构造函数new_item是非内联的,那么转换单元的程序集可能会将复制构造函数作为符号进行调用,但是如果链接时优化程序可以推断出链接时优化(LTO)仍然可以忽略该调用复制构造函数没有可观察到的副作用.
| 归档时间: |
|
| 查看次数: |
1148 次 |
| 最近记录: |