Позволяет печатать данные понятно, кратко и безопасно — как в Python, но в C++.
Что важно знать:
• Проверка формата сразу;
• Очень лёгкая сборка;
• Быстрее потоков вывода.
Подходит для CLI, логов и UI — в любом проекте станет читаемым и стабильным.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍7❤6
Многие об этом не знают и почти не используют!
В C++23 можно выполнять сложные вычисления прямо во время компиляции с помощью ключевого слова
Пример: функция
•
•
Удобно для генерации таблиц, коэффициентов, lookup-массивов и всего, что не нужно пересчитывать при каждом запуске.
📣 C++ Ready | #совет
В C++23 можно выполнять сложные вычисления прямо во время компиляции с помощью ключевого слова
consteval.Пример: функция
fib() вычисляет последовательность Фибоначчи ещё до запуска программы:constexpr auto seq = fib(10);
•
consteval гарантирует, что функция выполнится только при компиляции,•
constexpr сохраняет готовый результат в бинарнике.Удобно для генерации таблиц, коэффициентов, lookup-массивов и всего, что не нужно пересчитывать при каждом запуске.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍6❤1
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