Как я могу обеспечить выполнение RVO вместо копирования?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу обеспечить выполнение RVO вместо копирования?

Сообщение Anonymous »

Во многих случаях мне хотелось бы создать новый экземпляр данных и вернуть его вызывающей стороне API.

Я узнал об этом unique_ptr/

Код: Выделить всё

shared_ptr
можно использовать для шаблона Factory (например, шаблон Factory с использованием unique_ptr в C++)

В то же время я узнал, что оптимизация возвращаемого значения (RVO) возможна во многих компиляторах (например, Efficient way to return a std::vector в C++).

Я предпочитаю RVO, поскольку проще использовать возвращаемое значение без оболочки unique_ptr и легче читать код, однако, поскольку RVO не гарантируется, я не хочу неожиданно жертвовать производительностью и должен использовать unique_ptr, чтобы гарантировать, что возвращаемое значение перемещаетсяd, а не копируется.

Есть ли какой-либо подход, при котором я могу явно указать возвращаемое значение, которое нужно переместить, чтобы либо оно ни на что не жаловались, если RVO возможно, либо вызывало какое-то предупреждение компилятора, если RVO невозможно? Если это возможно, я могу безопасно избавиться от возврата unique_ptr в этом случае.

Я использую C++ 17, и мне нужна поддержка Apple Clang 11.0 в macOS и g++ 9 в Linux.

Отредактировано:

Я все еще изучаю C++ и не делаю различия между RVO (оптимизация возвращаемого значения). и NRVO (оптимизация именованного возвращаемого значения) при публикации этого вопроса. Мне кажется, NRVO более распространен и полезен в таких шаблонах, как фабричный метод, например:

Код: Выделить всё

vector vec;
// populate data into vec
return vec;
И я ищу что-то вроде возврата std::move_only(returned_value), который выдаст мне предупреждение компилятора, если это значение невозможно переместить (а не скопировать для перемещения).
Может быть, мне следует перефразировать мой вопрос так: если NRVO не гарантировано, почему «возврат по значению» по-прежнему является рекомендуемым способом в этом вопросе (эффективный способ вернуть std::vector в c++), не должен ли ответ быть «это зависит» от реализации вашей функции и от того, можете ли вы принять непредвиденные потери производительности?

Подробнее здесь: https://stackoverflow.com/questions/605 ... -performed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»