Многие уверены, что при возврате локального объекта из функции обязательно сработает копирование или хотя бы перемещение.
Но это не так. Правильный ответ: ничего не копируется и не мувится вовсе.
Компилятор просто создаёт объект сразу на месте вызова функции — это и есть Named Return Value Optimization (NRVO).
Разберёмся на примере:
Многие ждут хотя бы
Ни копии, ни мува.
Объект
Теперь внесём "улучшение", которое сломает оптимизацию:
Результат:
Добавив
🔥 Не вставляйте
Дайте компилятору сделать работу за вас.
📣 C++ Ready | #практика
Но это не так. Правильный ответ: ничего не копируется и не мувится вовсе.
Компилятор просто создаёт объект сразу на месте вызова функции — это и есть Named Return Value Optimization (NRVO).
Разберёмся на примере:
#include <iostream>
struct Probe {
Probe() { std::cout << "default\n"; }
Probe(int) { std::cout << "ctor\n"; }
Probe(const Probe&) { std::cout << "copy\n"; }
Probe(Probe&&) noexcept { std::cout << "move\n"; }
};
Probe makeProbe(int x)
{
Probe p{x};
return p; // ← здесь сработает NRVO
}
int main()
{
auto obj = makeProbe(42);
}
Многие ждут хотя бы
move, но результат:ctor
Ни копии, ни мува.
Объект
p создаётся сразу в месте obj — без промежуточных конструкторов.Теперь внесём "улучшение", которое сломает оптимизацию:
Probe makeMoved(int x)
{
Probe p{x};
return std::move(p); // кажется, мы помогаем...
}
Результат:
ctor
move
Добавив
std::move, мы запретили NRVO и заставили компилятор действительно переместить объект.🔥 Не вставляйте
std::move, если возвращаете локальный объект по имени.Дайте компилятору сделать работу за вас.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍6🔥3
Двунаправленный BFS ускоряет поиск, запуская его одновременно с начала и конца.
Что важно знать:
• Две независимые очереди;
• Встреча даёт ответ;
• Меньше просмотренных вершин.
Простой и мощный приём, особенно полезный в больших и широких графах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍4❤3
С C++20 можно обрабатывать контейнеры лениво и декларативно с помощью ranges & views — без копирования, временных векторов и вложенных циклов.
Пример:
vec | std::views::filter(...) | std::views::transform(...)Фильтруем, преобразуем и итерируем — без аллокаций и промежуточных шагов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤6🔥3
Сегодня создадим утилиту, которая позволяет делиться ссылками, которые автоматически удаляются спустя заданное количество минут.
Что важно знать:
• Генерирует короткие коды;
• Поднимает HTTP-сервер;
• Удаляет просроченные записи.
Полезно для внутренних сервисов, приватных файлов или одноразовых переходов по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥5👍4
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍8❤3🤝2