MediumRVOоптимизация
Чем return-by-value эффективен благодаря RVO?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Возврат объекта по значению интуитивно кажется дорогим (копия при возврате). Но RVO/NRVO конструирует объект сразу в стеке вызывающего — никакого копирования. В C++17 guaranteed copy elision для prvalue обязывает компилятора так сделать.
std::vector<int> makeVec() {
std::vector<int> v;
v.push_back(1);
v.push_back(2);
return v; // NRVO: 0 копий, объект в стеке вызывающего
}
auto data = makeVec(); // безопасно, читаемо, эффективно- В C++17
return T(args)— guaranteed copy elision, copy/move не нужны и не требуются; - Если NRVO не сработал (сложный control flow) — сработает move-конструктор (O(1) для vector/string);
- Не нужно возвращать по ссылке «для скорости» — это часто dangling.
Всегда предпочитайте return by value.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.