Во многих случаях я хотел бы создать новый экземпляр данных и вернуть его вызывающей стороне API.
Я узнал, что unique_ptr
/ shared_ptr
можно использовать для заводского шаблона (например, Заводской шаблон с использованием unique_ptr в c ++ )
В то же время, Я узнал, что оптимизация возвращаемого значения (RVO) возможна во многих компиляторах (например, Эффективный способ вернуть std :: vector в c ++ ).
Я предпочитаю RVO, поскольку легче использовать возвращаемое значение без переноса unique_ptr
и легче читать код, однако, поскольку RVO не гарантируется, я не хочу неожиданно жертвовать производительностью и необходимо использовать unique_ptr
, чтобы убедиться, что возвращаемое значение равно move
d, а не скопировано.
Существует ли какой-либо подход, в котором я могу явно указать возвращаемое значение для перемещения, чтобы либо он не жаловался на что-либо, если RVO возможен, либо он вызывал бы некоторое предупреждение компилятора, если RVO невозможен? Если это возможно, я могу смело избавиться от возврата unique_ptr в этом случае.
Я использую C ++ 17 и мне нужно поддерживать Apple Clang 11.0 на macOS и g ++ 9 на Linux.
Отредактировано:
Я все еще изучаю C ++ и не делал различий между RVO (оптимизация возвращаемого значения) и NRVO (оптимизация именованного возвращаемого значения) при публикации этого вопроса. Мне кажется, NRVO более распространен и полезен в шаблонах, таких как фабричный метод, например:
vector<foo> vec;
// populate data into vec
return vec;
И я ищу что-то вроде return std::move_only(returned_value)
, которое выдаст мне предупреждение компилятора, если это значение не может быть перемещенным (не копировать для перемещения). Возможно, мне следует перефразировать мой вопрос следующим образом: если NRVO не гарантируется, почему «возвращение по значению» все еще является рекомендуемым способом в этом вопросе ( Эффективный способ вернуть std :: vector в c ++ ), не должен ли ответ быть «это зависит» от реализации вашей функции и от того, согласны ли вы с неожиданными затратами на производительность?