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 подскажет развёрнутый ответ в реальном времени.