C/C++ Ready | Программирование
14.9K subscribers
1.24K photos
68 videos
564 links
Авторский канал по разработке на C и C++.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

РКН: https://clck.ru/3QREHc

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
✍️ Нашёл очень сильную статью — отличный вход в компьютерную графику через практику!

В этой статье:
• Базовая модель камеры и выпуск лучей в сцену
• Пересечение луча со сферой и расчет цвета пикселя
• Добавление материалов, отражений и простых теней


🔊 Продолжай читать на Habr!


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
17🔥6👍5
Почему assert исчезает в release и как не потерять проверки!

assert работает только пока у вас не задан NDEBUG. Когда вы собираете release с -DNDEBUG, проверки из assert вырезаются, поэтому поведение меняется:
#include <cassert>

void process(int index, int size) {
assert(index >= 0 && index < size);
// ...
}


Такой код полезен в debug, потому что он сразу показывает нарушение контракта.

Но в release этот assert может не выполниться ни разу, и поэтому критичные проверки нельзя оставлять только в нем:
# обычно для release
-DNDEBUG


Рабочий подход такой: через assert проверяйте внутренние инварианты, а пользовательские и внешние данные валидируйте обычным if, который останется в любом режиме сборки:
if (index < 0 || index >= size) {
throw std::out_of_range("index");
}
assert(index >= 0 && index < size);


🔥 Если коротко, assert нужен для отладки, а надежность release-версии должна держаться на явной валидации входа.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥84
This media is not supported in your browser
VIEW IN TELEGRAM
❤️ AlgoTree — понятные объяснения алгоритмов, деревьев и графов!

Этот сайт помогает анализировать структуры данных: деревья, графы, обходы и множество другого. Здесь нет решений задач или подготовкой к собеседованиям, упор именно на понимание того, как и почему всё устроено. Материал подается последовательно и концептуально, поэтому хорошо подходит даже новичкам.

📌 Оставляю ссылочку: algotree.org

📣 C++ Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍9🔥8
Почему return std::move(local) иногда делает код медленнее?

На вид это выглядит как явная оптимизация. Кажется, что ты прямо говоришь компилятору: «перемещай».

Но в return у локальной переменной работает важная оптимизация. При return s; компилятор часто строит итоговый объект сразу на месте. Лишнего перемещения в этом случае вообще нет.

Когда ты пишешь return std::move(s);, этот путь часто отключается. Тогда появляется отдельный move, а это уже лишняя операция.

Поэтому в таком месте явный std::move часто не помогает, а мешает.
std::string make_name() {
std::string s = "neo";
return s;
}


🔥 Если возвращаешь локальный объект, в большинстве случаев пиши просто return s;.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1611👍5
👩‍💻 Ошибки без исключений и “if-ада”

В этой шпаргалке — как использовать std::expected, чтобы возвращать ошибки явно и при этом писать код цепочками: прокидывать фейлы автоматически, аккуратно трансформировать успешный результат и превращать ошибку в понятный диагноз

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥257👍5🤝3👎1
Почему std::vector копирует при росте, хотя move-конструктор есть?

Когда vector увеличивает емкость, он переносит элементы в новую память. В этот момент контейнер старается сохранить сильную гарантию исключений. Если move может бросить, vector выбирает более безопасный путь и копирует.

Из-за этого в горячем месте можно получить неожиданную просадку. В коде вроде все современно, но на больших объемах срабатывает не тот сценарий, который ты ждешь.

Если перенос у типа реально безопасен, его стоит явно пометить как noexcept.
struct Buffer {
Buffer(Buffer&&) noexcept = default;
};


Есть важный нюанс. Если копирование недоступно, контейнеру иногда просто не из чего выбирать, и он будет переносить даже без noexcept.

🔥 Если тип хранится в vector, проверяй move-конструктор. Без noexcept контейнер часто выберет copy.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥87
✍️ Сильная статья — много практики по CPU, памяти и синхронизации компонентов!

В этой статье:
• Разбор ключевых узлов Mega Drive и их взаимодействия
• Эмуляция процессора и картирования памяти
• Базовая графика, звук и цикл исполнения кадров

🔊 Продолжай читать на Habr!


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥178👍3
Что же выведет консоль?
Anonymous Quiz
29%
A
50%
B
10%
C
11%
D
🔥146👍6
This media is not supported in your browser
VIEW IN TELEGRAM
FlowchartAI — это бесплатный AI-генератор блок-схем, который из текста или кода автоматически строит диаграмму. Он анализирует твой ввод (описание процесса/алгоритма или код) и превращает его в визуальную блок-схему, которую можно смотреть прямо в браузере без регистрации.

📌 Оставляю ссылочку: flowchartai.org

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍7🔥7👎1
Когда std::string_view помогает, а когда создает висячие ссылки!

std::string_view полезен там, где нужна легкая ссылка на строку без копирования. Это делает интерфейсы аккуратнее и часто снижает лишние аллокации.

Ниже пример безопасного использования в параметре функции чтения.
void log_message(std::string_view text) {
}


Проблемы начинаются, когда view живет дольше строки, на которую он смотрит. Тогда ошибка может проявляться нестабильно, и ее тяжело поймать без хороших проверок.
std::string_view bad() {
return std::string("tmp");
}


Есть и более тихий вариант той же проблемы, когда появляется временный объект после substr.
std::string s = "hello";
std::string_view v = s.substr(0, 3);


В таких местах код выглядит невинно, поэтому ошибка часто проходит ревью. Если время жизни источника неочевидно, безопаснее хранить и возвращать std::string.

std::string_view остается отличным инструментом, но только когда вы явно контролируете время жизни данных.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥145👍4
✍️ Очень полезный технический разбор для тех, кто хочет глубже понять runtime и планирование задач!

В этой статье:
• Что такое fibers и чем они отличаются от потоков
• Сохранение и восстановление контекста на ассемблере
• Интеграция волокон в C++-код с рабочими примерами

🔊 Продолжай читать на Habr!


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥84👍4
Structured bindings — не только для std::pair / std::tuple!

Многие знают structured bindings как способ “распаковать” std::pair или std::tuple, но с C++17 это работает и для обычных struct — если поля публичные.

Было:
Point p{10, 20};
int x = p.x;
int y = p.y;


Стало:
auto [x, y] = p;


Плюсы:

меньше шума в коде, особенно когда полей 2–3
удобно в циклах и при распаковке результата функций
имена задаёшь сразу на месте — читается быстрее

Нюанс: это копия значений. Если нужен доступ к оригинальным полям (чтобы менять их), бери ссылки:
auto& [x, y] = p;
x = 42; // изменит p.x


🔥 Итог: если работаешь с простыми struct (Point, Size, Range) — распаковывай их через structured bindings. Код становится короче и понятнее без .x/.y на каждой строке.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥185🤝4
📂 Шпаргалка по алгоритмам STL в C++!

На картинке — компактная визуальная памятка по стандартным алгоритмам C++, показывающая, какие операции можно выполнять с диапазонами: поиск и проверки без изменения данных, переупорядочивание элементов, изменение значений, работу с отсортированными последовательностями и числовые алгоритмы.

Сохрани, чтобы быстрее ориентироваться в STL и реже лезть в документацию при написании C++-кода.

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍5🔥5
👩‍💻 Быстрый подсчёт размера папки — одной функцией на <filesystem>!

Небольшая консольная утилита проходит по директории и суммирует размеры всех обычных файлов, чтобы получить общий “вес” папки в байтах.

В этой задаче узнаешь:

Как обойти директорию рекурсивно через recursive_directory_iterator;

Как отличать файлы от папок и “прочих” объектов (is_regular_file) и брать размер (file_size);

Почему обход может бросать исключения и как аккуратно обработать ошибки доступа.


Мини-утилита получается кроссплатформенной и легко расширяется.

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥165👍5