Использование лямбда-функции в C++ с переменными, захваченными значением, означает copy of the value.Будет ли C++ лямбда действительно делать копии параметров, захваченных копией?
С хорошим компилятором и предполагая, что мы не изменяем значение в функции лямбда, можем ли мы надеяться, что не будет никакой реальной копии после компиляции и оптимизации кода?
Например, в следующем смысле представляется целесообразным передать 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
?
Гарантия не известна. Хороший компилятор * может * оптимизировать копию, но это не требуется. –
Единственное, что вы знаете, это код, который должен вести себя так, как он. Если нет никакой разницы между вложением всей вещи и не созданием копий/объектов и тем, что вы написали, тогда компилятор мог это сделать. Будет ли он? скомпилировать его и проверить сборку. – NathanOliver
Этот вопрос кажется мне более интересным, чем другим двум комментаторам. AFAIK, компилятору разрешено выдавать копии только в определенных условиях, и я не знаю, является ли захват лямбда одним из них. (Это не имеет значения, когда копии тривиальны, но OP, вероятно, не волнует, если копии были тривиальными.) – zneak