Компиляторы автоматически используют семантику перемещения, когда подвижный объект используется в последний раз?

В последнее время я изучал ссылки на 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 подходит к концу, даже без подсказки, и не наказывать меня дополнительной копией. Фактически, компилятор должен уметь распознавать это даже в сложных функциях.

Вопросы:

  1. Разрешена ли такая оптимизация стандартом C ++ 0x?

  2. Применяют ли ее компиляторы? Даже в сложных случаях, т.е. функция состоит из более чем одной строки?

  3. Насколько надежна эта оптимизация, т.е. могу ли я ожидать, что компилятор будет использовать ее столько, сколько я ожидаю, что компилятор применит оптимизацию возвращаемого значения?

22
задан Toby Speight 28 July 2017 в 08:33
поделиться