Я узнал об этом unique_ptr/
Код: Выделить всё
shared_ptrВ то же время я узнал, что оптимизация возвращаемого значения (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;
Может быть, мне следует перефразировать мой вопрос так: если NRVO не гарантировано, почему «возврат по значению» по-прежнему является рекомендуемым способом в этом вопросе (эффективный способ вернуть std::vector в c++), не должен ли ответ быть «это зависит» от реализации вашей функции и от того, можете ли вы принять непредвиденные потери производительности?
Подробнее здесь: https://stackoverflow.com/questions/605 ... -performed
Мобильная версия