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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
Что же выведет консоль?
Anonymous Quiz
20%
A
51%
B
23%
C
6%
D
👍115🔥3
📂 Шпаргалка по IP-адресам!

Например, 192.168.x.x — для домашней сети, а 10.x.x.x — для крупных корпоративных систем. CIDR (/24, /16, /8) — помогает точно задать размер подсети и количество хостов.

На картинке — всё, что нужно знать про IP: диапазоны, маски, специальные адреса, публичные DNS и основы IPv6.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
27👍9🔥8
Почему vector{10, 1} и vector(10, 1) — это разные контейнеры?

На вид разница “всего лишь в скобках”, но смысл радикально меняется.

Круглые скобки выбирают конструктор “размер + значение”, то есть создают 10 элементов со значением 1:
std::vector<int> a(10, 1);


А фигурные скобки в первую очередь пытаются попасть в конструктор с std::initializer_list, который трактует аргументы как список элементов. Поэтому тут создаётся вектор из двух элементов: 10 и 1:
std::vector<int> b{10, 1};


Это ловушка потому, что initializer_list при наличии часто “побеждает” другие перегрузки — и ты получаешь не тот контейнер, который ожидал.

🔥 Если ты хочешь “N одинаковых элементов” — используй (n, value). Если хочешь “конкретные элементы” — используй {...}

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👍98🤝1
🧐 Шпаргалка по std::string_view!

На картинке — компактная памятка по std::string_view: что это лёгкий, не владеющий памятью и read-only “вид” на строку/массив символов, как его удобно передавать в функции без лишних копий, и какие методы чаще всего используются

Отдельно подсвечены важные моменты: string_view отлично подходит для подстрок и диапазонов без копирования, но нужно следить за временем жизни исходной строки — view может “пережить” данные и стать висячим.

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5🔥5
👩‍💻 Мини-игра на память, где цифры исчезают за секунду!

Программа показывает последовательность цифр по одной, быстро стирает экран и просит ввести всё в том же порядке, превращая обычный запуск в маленький тренажёр внимания.

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

Как генерировать случайную последовательность и хранить её в std::vector;

Как паузы через std::chrono и sleep_for создают “напряжение” и делают игру честной;

Как быстро проверить результат, сравнивая ответы по позициям.


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

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥245👍4😁1🤝1
Media is too big
VIEW IN TELEGRAM
CppDeveloperRoadmap — репозиторий, в котором собраны книги, идеи для пэт-проектов и полезные ресурсы для изучения. Все материалы разбиты на уровни junior, middle и senior.

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


📣 C++ Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥125👍3
std::span + subspan(): “нарезай” буфер на части без копий и лишних new!

Это особенно удобно для протоколов и парсинга, где есть заголовок, тело и хвост.

Часто делают так: копируют куски в новые контейнеры.
std::vector<uint8_t> header(const std::vector<uint8_t>& buf, size_t n) {
return {buf.begin(), buf.begin() + n};
}

std::vector<uint8_t> payload(const std::vector<uint8_t>& buf, size_t n) {
return {buf.begin() + n, buf.end()};
}


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

std::span не владеет памятью, зато позволяет сделать “вид” на нужный участок, и subspan() как раз возвращает такой срез.

Вместо копий — просто виды на исходный буфер:
struct PacketView {
std::span<const std::uint8_t> hdr;
std::span<const std::uint8_t> body;
};

PacketView split(std::span<const std::uint8_t> buf, std::size_t n) {
return {
buf.subspan(0, n),
buf.subspan(n)
};
}


Использование выглядит так же просто:
int main() {
std::vector<std::uint8_t> buf = {1,2,3,4,5,6,7,8};

auto p = split(buf, 3);
// p.hdr -> {1,2,3}
// p.body -> {4,5,6,7,8}
}


Важно помнить: span живёт только пока живут исходные данные, поэтому нельзя возвращать span на временный объект или локальный буфер, который скоро уничтожится.

🔥subspan() — это “срез без копии”: идеально для парсинга и разборки буферов, когда нужно быстро выделять части и не плодить новые вектора.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
15🔥8👍5
☕️ Отличная статья — про то, как в RESTinio устроены “многоэтажные” шаблоны и зачем они нужны!

В этой статье:
• Понять, зачем в сервере столько уровней шаблонов вообще
• Увидеть, как через типы собирается конфигурация API сервера
• Разобраться, как шаблоны уменьшают бойлерплейт без рантайма лишнего

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


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥73👍3😁1
Почему {} иногда спасает от скрытых багов с конверсиями?

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

В C++ есть безопасная привычка: использовать uniform initialization с фигурными скобками. Она запрещает narrowing-конверсии — то есть те, где можно потерять данные.

Например, вот это должно насторожить:
int a = 300;
std::uint8_t b{a};


std::uint8_t обычно хранит 0..255, а 300 не влезает. С {} компилятор обязан ругнуться, вместо того чтобы молча обрезать значение.

То же самое с дробными числами:
double pi = 3.14;
int x{pi};


С {} ты не сможешь “случайно” потерять дробную часть — компилятор остановит сборку.

🔥 Итог: если инициализируешь числа (особенно при приведениях типов), чаще используй {} — это дешёвый способ ловить “тихие” обрезания на этапе компиляции.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍206🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ Preshing on Programming — блог про низкоуровневый C++ и многопоточность!

Технический блог Джеффа Прешинга, где он объясняет сложные темы “на пальцах”: атомики и memory ordering, lock-free подходы, тонкости работы компилятора/CPU и практические паттерны для производительного кода.

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

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
16🔥6👍4
👩‍💻 Move-семантика без сюрпризов!

В этой шпаргалке — понятное объяснение, почему std::move сам по себе ничего не “перемещает”, что на самом деле гарантируется после move, как noexcept влияет на поведение и скорость контейнеров

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