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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
👩‍💻 Разберём unique_ptr — умный указатель для безопасного и автоматического управления ресурсами!

С ним можно легко создавать объекты на куче, работать с сырыми указателями без передачи владения, освобождать или менять ресурс, обмениваться им за константное время, а также получать доступ к данным через * и ->

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🤝134👍4
This media is not supported in your browser
VIEW IN TELEGRAM
😎 Fluent Cpp — сайт, который поможет писать код на C++ понятным, лаконичным и профессиональным!

Здесь вы найдёте глубокие статьи, практические советы и техники, помогающие лучше использовать возможности языка, улучшать читаемость кода и развивать архитектурное мышление.

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

📣 C++ Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5🔥2
Убираем все пробелы из строки!

Сейчас научимся быстро удалять все пробельные символы (пробел, таб, перевод строки) из строки. Это пригодится при парсинге ввода, чтении конфигов или очистке текстовых данных.

Сначала подключим необходимые библиотеки из стандартной поставки:
#include <string>
#include <algorithm> // std::erase_if (C++20)
#include <cctype> // std::isspace


Допустим, у нас есть строка с лишними пробелами и табуляцией:
std::string raw = "  Hello\tWorld \n ";


Теперь удалим все пробельные символы с помощью одного вызова:
std::erase_if(raw, [](unsigned char c) {
return std::isspace(c);
});
std::cout << raw << '\n';


Результат при запуске программы:
HelloWorld


🔥 Таким образом ты можешь быстро очищать строки от пробелов — без циклов, копий и лишнего кода.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍63
📂 Напоминалка по архитектуре систем!

Например, Load Balancing распределяет нагрузку между серверами, а Caching помогает ускорить ответы за счёт хранения данных в памяти.

На картинке — 12 основных концепций, которые должен понимать каждый разработчик.

Сохрани, чтобы не потерять!

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1610👍9
Почему захват [this] в асинхронном коде опасен?

Многие воспринимают [this] как безопасный способ вызвать метод объекта позже. Но на самом деле лямбда сохраняет только указатель this. Она не продлевает время жизни объекта.

Если задача выполнится уже после уничтожения Session, лямбда попробует обратиться к несуществующему объекту. В лучшем случае это закончится падением, в худшем — редким и трудноуловимым UB.

Проблема в том, что код выглядит абсолютно нормально. Пока объект жив, все работает. Но как только lifetime объекта и lifetime задачи расходятся, появляется use-after-free.

Например, опасный сценарий выглядит так:
void run(ThreadPool& pool) {
Session s;
s.start(pool);
} // s уже уничтожен, а задача может выполниться позже


Еще хуже, когда внутри лямбды идет доступ к полям объекта:
class Session {
std::string buffer;

public:
void start(ThreadPool& pool) {
pool.post([this] {
std::cout << buffer << "\n"; // доступ к уже мертвому объекту
});
}
};


Если объект должен пережить асинхронный вызов, его временем жизни нужно управлять явно. Обычно для этого используют shared_ptr и weak_ptr.
class Session : public std::enable_shared_from_this<Session> {
public:
void start(ThreadPool& pool) {
auto weak = weak_from_this();
pool.post([weak] {
if (auto self = weak.lock()) {
self->flush();
}
});
}

void flush();
};


Такой код сначала проверяет, жив ли объект вообще, и только потом вызывает метод.

Иногда используют и более прямой вариант с shared_from_this(), когда задаче нужно гарантированно удерживать объект живым до конца выполнения:
void start(ThreadPool& pool) {
auto self = shared_from_this();
pool.post([self] {
self->flush();
});
}


🔥 Захват [this] не делает асинхронный код безопасным. Если время жизни объекта не контролируется, это прямой путь к use-after-free.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥7🤝5👍1
This media is not supported in your browser
VIEW IN TELEGRAM
👍 Free Programming Books — библиотека ресурсов по программированию на различных языках!

Проект постоянно обновляется сообществом и уже включает тысячи книг, курсов и обучающих ресурсов на разных языках, включая русский . Всё удобно разбито по категориям, отдельные разделы посвящены C++, C#, поэтому можно быстро найти нужную тему и начать изучение. Отлично подходит как база для самообучения.

Оставляю ссылочку: GitHub 📱


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍159🔥9
📂 Напоминалка по системам хранения данных!

Например, CPU cache и RAM дают минимальную задержку и используются для быстрых вычислений, а cloud storage и базы данных — для долговременного хранения и масштабирования.

На картинке — основные типы storage, которые используются в современных системах: от памяти процессора до облачных решений.

Сохрани, чтобы не потерять!

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍168🤝8👎1
Почему emplace_back() не всегда лучше push_back()?

Есть популярное заблуждение, что emplace_back() всегда быстрее. Но это не так.

push_back() добавляет в контейнер уже готовый объект.
emplace_back() конструирует объект прямо на месте из переданных аргументов.

Например:
v.emplace_back("world");


здесь строка создается сразу внутри vector, и это действительно удобно.

Но если объект у тебя уже есть:
std::string s = "hello";
v.push_back(s);


то замена на
v.emplace_back(s);


обычно не дает никакого особого выигрыша. По смыслу это почти то же самое.

emplace_back() полезен, когда ты передаешь аргументы конструктора.
push_back() — когда у тебя уже есть готовое значение.

🔥 emplace_back() — не универсально лучший вариант. Используй его там, где нужен именно in-place construction.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍7🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ CyberForum — крупнейшее сообщество разработчиков с разделами по C++ и C#!

Форум, где можно обсуждать задачи, получать помощь и разбирать кейсы из разработки. Есть активные разделы по C++ и C#: обсуждение синтаксиса, разбор ошибок, советы по обучению и практическая помощь. Форум можно использовать как источник знаний, особенно когда требуется разобраться в конкретной задаче или посмотреть, как её решают другие разработчик.

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

📣 C++ Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
20👍9🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
😍 PVS-Studio Blog — технические статьи по коду и разработке!

Здесь публикуются подробные разборы ошибок, уязвимостей и практик разработки. Основной фокус на статический анализ кода и реальные кейсы из проектов, включая разборы популярных open-source решений. Блог активно покрывает C++ и C#: публикуются статьи по анализу, поиску багов, особенностям работы компиляторов и практике.

📌 Оставляю ссылочку: pvs-studio.ru

📣 C++ Ready | #сайт
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥9👍5
Как shared_ptr может привести к утечке памяти?

Потому что подсчет ссылок не умеет сам разрывать циклы.

Если два объекта держат друг друга через std::shared_ptr, их счетчики ссылок никогда не станут равны нулю. Даже когда внешний код уже “отпустил” оба объекта, они продолжают владеть друг другом.

Например, в такой схеме:
struct A {
std::shared_ptr<B> b;
};

struct B {
std::shared_ptr<A> a;
};


объект A владеет B, а B владеет A.
Получается замкнутый круг: оба объекта остаются в памяти, потому что у каждого все еще есть хотя бы один владелец.

Именно поэтому shared_ptr не гарантирует автоматическое освобождение памяти во всех случаях.

Чтобы разорвать цикл, одна из ссылок должна быть не владеющей:
struct B {
std::weak_ptr<A> a;
};


std::weak_ptr не увеличивает счетчик владения, поэтому цикл исчезает, и объекты могут быть корректно уничтожены.

🔥 shared_ptr считает владельцев, но не умеет сам разрывать циклы. Для этого нужен weak_ptr.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍165🔥5
📂 Шпаргалка по вычислительным архитектурам!

Например, CPU хорошо справляется с логикой, ветвлениями и задачами с низкой задержкой. GPU — про массовый параллелизм: подходит для обработки больших массивов данных, графики и вычислений.

На картинке — наглядное сравнение архитектуры, модели вычислений и типичных сценариев применения для каждого типа процессоров.

Сохрани, чтобы не потерять!

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥96
Меньше .first и .second: разбираем pair и tuple по-человечески!

Когда работаешь с std::pair, std::tuple или элементами std::map, код быстро зарастает обращениями вроде .first, .second и std::get<0>(). Читать это неудобно, особенно если таких мест много.

В C++17 для этого есть structured bindings. Они позволяют сразу разложить объект на именованные переменные.

Например, так можно пройтись по std::map:
#include <iostream>
#include <map>
#include <string>

std::map<std::string, int> scores{
{"alice", 10},
{"bob", 20}
};

for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << '\n';
}


Без structured bindings пришлось бы писать менее выразительно:
for (const auto& item : scores) {
std::cout << item.first << ": "
<< item.second << '\n';
}


То же самое работает и с std::pair:
std::pair p{"error", 500};

auto [text, code] = p;
std::cout << text << ' ' << code << '\n';


Код становится короче и понятнее: вместо технических .first и .second появляются нормальные имена переменных, которые сразу передают смысл.

🔥 Structured bindings делают код читаемее: меньше служебного шума, больше понятных имён.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍6🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
💅 Beautiful — нейросеть для создания презентаций!

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

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍146🤝6
👩‍💻 Разберём циклы с диапазоном и auto — способ проходить по контейнеру без индексов и явных итераторов!

С их помощью можно автоматически определять тип переменной, изменять элементы контейнера по ссылке, безопасно обходить коллекции без копирования, удобно распаковывать пары и кортежи

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21🤝13👍43