Mediummove-semanticsrvalue

Что такое move semantics и для чего она нужна?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Move semantics (C++11) передаёт владение ресурсом вместо копирования через rvalue references T&&. Для строки с большим буфером копирование — O(n), move — O(1).

std::string s1 = "очень длинная строка";
std::string s2 = s1;              // copy: malloc + memcpy (O(n))
std::string s3 = std::move(s1);   // move: обмен указателем (O(1)), s1 теперь пуст

// Реализация через move-конструктор:
class Buffer {
    int* data_;
    size_t n_;
public:
    Buffer(Buffer&& o) noexcept : data_(o.data_), n_(o.n_) { o.data_ = nullptr; o.n_ = 0; }
};

std::move — это просто cast к rvalue, ничего не двигает; фактически двигает код в move-конструкторе. Критична для возврата больших объектов, роста контейнеров, unique_ptr.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.