This media is not supported in your browser
VIEW IN TELEGRAM
C++ Patterns — тут собраны лаконичные карточки-паттерны с рабочими примерами кода, указанием минимального стандарта языка и подробным описанием назначения приёма.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥6👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Это огромная коллекция пошаговых гайдов, где учатся программированию через практику. Проекты реализованы на разных языках, в том числе на C# и C++. Здесь можно попробовать написать собственную базу данных, Git-клиент, веб-сервер, блокчейн, игровой движок, браузер или даже язык программирования.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤10👍8
scope_exit в C++: cleanup без goto и забытых close()
Когда в функции несколько
В таких местах удобно использовать маленький RAII-хелпер, который выполнит переданную лямбду при выходе из scope. Это особенно полезно в коде с исключениями и несколькими точками выхода.
Начнём с самого класса:
Он хранит функцию cleanup и флаг, нужно ли её вызывать.
В деструкторе cleanup выполнится автоматически, если guard ещё активен.
Теперь добавим маленький helper, чтобы не писать тип вручную:
С ним использование получается заметно чище.
Открываем файл и сразу вешаем cleanup рядом:
Это главный плюс паттерна: ресурс и его освобождение находятся буквально рядом.
Дальше могут быть любые ранние выходы:
Даже если функция завершится раньше,
Такой helper быстро окупается в коде, где много веток, ошибок и временных ресурсов. Он убирает дублирование и делает cleanup предсказуемым.
🔥 Маленький RAII-хелпер, который точно вам поможет!
📣 C++ Ready | #практика
Когда в функции несколько
return, ручной cleanup почти всегда становится хрупким. Один выход забыли — и файл не закрыт, ресурс не освобождён, а ошибка всплывёт уже сильно позже.В таких местах удобно использовать маленький RAII-хелпер, который выполнит переданную лямбду при выходе из scope. Это особенно полезно в коде с исключениями и несколькими точками выхода.
Начнём с самого класса:
template <class F>
class scope_exit {
F fn;
bool active = true;
Он хранит функцию cleanup и флаг, нужно ли её вызывать.
public:
explicit scope_exit(F f) : fn(std::move(f)) {}
~scope_exit() { if (active) fn(); }
В деструкторе cleanup выполнится автоматически, если guard ещё активен.
void release() noexcept { active = false; }
};release() нужен, если в каком-то сценарии cleanup уже не требуется.Теперь добавим маленький helper, чтобы не писать тип вручную:
template <class F>
scope_exit<F> make_scope_exit(F f) {
return scope_exit<F>(std::move(f));
}
С ним использование получается заметно чище.
Открываем файл и сразу вешаем cleanup рядом:
FILE* f = std::fopen("data.bin", "wb");
if (!f) throw std::runtime_error("open failed");
auto guard = make_scope_exit([&] { std::fclose(f); });Это главный плюс паттерна: ресурс и его освобождение находятся буквально рядом.
Дальше могут быть любые ранние выходы:
if (std::rand() % 2)
return;
std::fwrite("abc", 1, 3, f);
Даже если функция завершится раньше,
fclose всё равно вызовется автоматически.Такой helper быстро окупается в коде, где много веток, ошибок и временных ресурсов. Он убирает дублирование и делает cleanup предсказуемым.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤4👍3👎2
В этой статье:
• Что такое эмулятор микропроцессора и как он повторяет поведение реального CPU• Базовый каркас эмулятора: память, регистры, декодирование и выполнение инструкций• Разбор режимов адресации MOS6502 и их реализация на C++ с примерами кода🔊 Продолжай читать на habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤4👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍5❤4🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь можно быстро найти краткие справочники по синтаксису, командам и ключевым возможностям разных языков, чтобы не тратить время на долгий поиск документации. На сайте есть подробные шпаргалки по C++ и C#: быстрые справочники по синтаксису, контейнерам, алгоритмам STL, .NET и другим вещам, которые постоянно используются в разработке.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍9🔥8
Почему std::move не делает move?
Многие воспринимают
В этом примере проблема в
Из-за этого легко получить неожиданный
Если объект действительно нужно переместить, он не должен быть
Именно поэтому
🔥
📣 C++ Ready | #совет
Многие воспринимают
std::move как команду на перенос. Но на самом деле он ничего не перемещает сам по себе. Он только приводит объект к rvalue, а дальше уже перегрузки решают, что будет вызвано: move или copy.В этом примере проблема в
const. После std::move(p) тип выражения — const Packet&&. Но move-конструктор обычно принимает Packet&&, то есть неконстантный rvalue. Такой конструктор сюда не подходит, поэтому вызывается копирование.Из-за этого легко получить неожиданный
copy там, где по коду вроде бы явно написан move. Особенно неприятно, когда это происходит внутри контейнеров или в горячем участке кода.Если объект действительно нужно переместить, он не должен быть
const.Packet p{"payload"};
q.push_back(std::move(p)); // moveИменно поэтому
std::move — это не перенос, а всего лишь приведение. Он дает возможность вызвать move, но не гарантирует его.std::move сам ничего не двигает. Если объект const, вместо move ты почти наверняка получишь copy.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤5👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Например, Imperative Programming описывает программу как последовательность шагов, которые изменяют состояние, а Object-Oriented Programming строит код вокруг объектов и классов.
На картинке — 4 важные парадигмы программирования, которые используются в современных языках.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍7🔥7
Сегодня реализуем алгоритм сжатия строк с помощью RLE (Run-Length Encoding), а также восстановление строки из сжатого представления.
В этой задаче:
• Считаем длину последовательностей одинаковых символов и сразу добавляем в результат
• При распаковке парсим число и столько раз добавляем следующий символ.
• Проверяем корректность: сжимаем → распаковываем → сравниваем строки.
Такой приём особенно полезен для логов, графики и повторяющихся данных, где он экономит место.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍4❤3
Быстро тестируем код через assert.
Сейчас научимся добавлять простые проверки прямо в код, чтобы убедиться, что функции работают правильно. Это особенно удобно на этапе отладки и для мини-тестов без фреймворков.
Подключим нужную библиотеку:
Предположим, у нас есть функция, которая должна возвращать квадрат числа. Реализуем её так:
Теперь напишем несколько простых тестов с помощью assert, чтобы проверить, что функция работает правильно на базовых примерах:
Если проверка не пройдёт — программа остановится и покажет, где ошибка.
Вот как может выглядеть ошибка, если ожидание не совпадает с результатом:
🔥 Таким образом ты можешь быстро проверять поведение функций — без сторонних библиотек и с минимальным кодом.
📣 C++ Ready | #практика
Сейчас научимся добавлять простые проверки прямо в код, чтобы убедиться, что функции работают правильно. Это особенно удобно на этапе отладки и для мини-тестов без фреймворков.
Подключим нужную библиотеку:
#include <cassert>
#include <iostream>
Предположим, у нас есть функция, которая должна возвращать квадрат числа. Реализуем её так:
int square(int x) {
return x * x;
}Теперь напишем несколько простых тестов с помощью assert, чтобы проверить, что функция работает правильно на базовых примерах:
int main() {
assert(square(2) == 4);
assert(square(-3) == 9);
assert(square(0) == 0);
std::cout << "Все тесты пройдены!\n";
return 0;
}Если проверка не пройдёт — программа остановится и покажет, где ошибка.
Вот как может выглядеть ошибка, если ожидание не совпадает с результатом:
Assertion failed: square(2) == 5, file main.cpp, line 10
🔥 Таким образом ты можешь быстро проверять поведение функций — без сторонних библиотек и с минимальным кодом.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍4❤3
В этой статье:
• Как формируется изображение через плоскость проекции, камеру и направление лучей• Почему пиксели можно представить как результат пересечения лучей со сценой• Базовая логика, с которой начинается построение собственного трассировщика лучей🔊 Продолжай читать на habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍6🔥4