В последнее время я изучал ссылки на rvalue и пришел к выводу, что довольно выгодно использовать передачу по значению везде, где полная будет создана копия объекта (полное обоснование см., например, в Как уменьшить избыточный код при добавлении перегрузок оператора ссылки rvalue? и Хотите скорости? Передайте по значению! ), поскольку компилятор может автоматически оптимизировать копию в таких случаях, как f (std :: move (a));
, где f
определяется как void f (A a );
.
Одним из отрицательных последствий передачи по значению-везде является то, что весь код засоряется std :: move
даже в таких простых случаях, как:
void Object::value(A a)
{
value_ = std::move(a);
}
Очевидно, если бы я написал только следующее:
void Object::value(A a)
{
value_ = a;
}
, компилятору не должно быть сложно распознать, что срок службы a
подходит к концу, даже без подсказки, и не наказывать меня дополнительной копией. Фактически, компилятор должен уметь распознавать это даже в сложных функциях.
Вопросы:
Разрешена ли такая оптимизация стандартом C ++ 0x?
Применяют ли ее компиляторы? Даже в сложных случаях, т.е. функция состоит из более чем одной строки?
Насколько надежна эта оптимизация, т.е. могу ли я ожидать, что компилятор будет использовать ее столько, сколько я ожидаю, что компилятор применит оптимизацию возвращаемого значения?