push_back размещает два элемента в динамическом буфере. swap обменивает владение буферами за константное время: поэлементного копирования и нового выделения памяти для обмена не требуется.
Анализ поведения кода с использованием std::vector
push_back размещает два элемента в динамическом буфере. swap обменивает владение буферами за константное время: поэлементного копирования и нового выделения памяти для обмена не требуется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Нужно предсказать, как будет исполняться приведённый фрагмент, возникнут ли операции выделения памяти и копирования.
void vector_method()
{
std::vector<int> a;
// ========
a.push_back(1);
a.push_back(2);
std::vector<int> b;
b.swap(a);
}
Ответ
push_back размещает два элемента в динамическом буфере. swap обменивает владение буферами за константное время: поэлементного копирования и нового выделения памяти для обмена не требуется.
Первое добавление требует места для элемента; второе может вызвать рост ёмкости и перенос первого значения. Точное число выделений и коэффициент роста стандартом не фиксируются.
После b.swap(a) элементы 1 и 2 принадлежат b, а a пуст. На выходе b уничтожает элементы и освобождает буфер. Здесь используются одинаковые стандартные аллокаторы; условия обмена контейнеров с пользовательскими аллокаторами нужно проверять отдельно.