Объясните пример с std::vector и emplace_back: как избежать лишнего копирования?

Передавайте аргументы конструктора прямо в emplace_back, а не готовый временный объект. Для предотвращения перевыделений при известном размере заранее вызовите reserve.

Короткий ответ

Что ответить на собеседовании

Передавайте аргументы конструктора прямо в emplace_back, а не готовый временный объект. Для предотвращения перевыделений при известном размере заранее вызовите reserve.

Подробный разбор

Ответ с пояснениями

Передавайте аргументы конструктора прямо в emplace_back, а не готовый временный объект. Для предотвращения перевыделений при известном размере заранее вызовите reserve.

items.emplace_back(arg1, arg2) строит элемент в памяти vector. Запись items.emplace_back(Item(arg1, arg2)) сначала создаёт временный Item и обычно затем перемещает его, поэтому не использует главное преимущество emplacement.

Если capacity исчерпана, vector всё равно переносит существующие элементы в новый буфер. noexcept move-конструктор может позволить перемещение вместо копирования для сохранения гарантий исключений. reserve задаёт вместимость, а не размер.

Не вызывайте reserve на каждый новый элемент: это может разрушить эффективную стратегию роста. Для уже готового объекта push_back(std::move(item)) часто выражает намерение столь же понятно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее