Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🤝10❤6👍2
Ленивая подгрузка ресурса через std::future!
Иногда нужно заранее запустить тяжёлую загрузку (текстуру, шрифт, JSON) и продолжить работать, не блокируя поток.
Делается одной строкой:
Когда ресурс действительно понадобится (например, при первом рендере экрана), просто дожидаемся результата:
🔥 Плюсы: главное окно остаётся отзывчивым, а загрузка происходит «по требованию» — без сложной логики потоков и мьютексов.
📣 C++ Ready | #практика
Иногда нужно заранее запустить тяжёлую загрузку (текстуру, шрифт, JSON) и продолжить работать, не блокируя поток.
Делается одной строкой:
// запускаем асинхронно, файл подгружается в фоновом потоке
auto pngFuture = std::async(std::launch::async, load_png, "assets/ui/buttons.png");
Когда ресурс действительно понадобится (например, при первом рендере экрана), просто дожидаемся результата:
// ещё не забрали?
if (pngFuture.valid()) {
// блокирует только здесь
auto png = pngFuture.get();
// используем загруженную текстуру
draw(png);
}
🔥 Плюсы: главное окно остаётся отзывчивым, а загрузка происходит «по требованию» — без сложной логики потоков и мьютексов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍5🔥5
Они по умолчанию защищают от незаметных преобразований типов и выбирают очевидный способ создания объектов.
Что важно знать:
• Защита от потерь;
• Читается одинаково везде;
• Выявляет скрытые ошибки.
Ставьте фигурные скобки по умолчанию, а круглые оставьте для редких, явно нужных особых случаев.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27🤝10👍3❤1
Вместо
nullptr, -1 или "N/A" теперь можно возвращать отсутствие значения безопасно и явно — с помощью std::optional.Пример: функция
find_name() возвращает std::optional<std::string>. Если элемент найден — вернёт строку, если нет — std::nullopt.🔥 Явно показывает, что результат может отсутствовать и избавляет от неочевидных ошибок и nullptr-проверок,
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17❤6👍5
Многие уверены, что при возврате локального объекта из функции обязательно сработает копирование или хотя бы перемещение.
Но это не так. Правильный ответ: ничего не копируется и не мувится вовсе.
Компилятор просто создаёт объект сразу на месте вызова функции — это и есть 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