В последнее время я изучаю ссылки 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
находится ближе к концу его жизни даже без подсказки и не наказывать меня дополнительной копией. Фактически, компилятор должен уметь распознавать это даже в сложных функциях.
Вопросы:
-
Разрешена ли эта оптимизация стандартом С++ 0x?
-
Используют ли компиляторы? Даже в сложных случаях, т.е. Функция состоит из более чем одной строки?
-
Насколько надежна эта оптимизация, то есть я могу ожидать, что компилятор будет использовать ее столько, сколько я ожидаю, что компилятор применит Оптимизацию возвращаемого значения?