Использование лямбда-функции в 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
?
loadavg_item
. Что, если они все тривиальные типы? Невозможно точно сказать, всегда ли компилятор создает копию или нет. В любом случае мне непонятно, почему OP вообще не захватываетnew_item
по ссылке. - person Praetorian   schedule 09.08.2016find_if
, если компилятор может определить, что развертывание цикла имеет больше смысла в этом случае и что вloadavg_item
есть только один член данных, с которым вы заботитесь о сравнении, и указанный член данных имеет некоторый тривиальный тип. - person Praetorian   schedule 09.08.2016