C++ Academy
15.6K subscribers
810 photos
143 videos
1 file
751 links
По всем вопросам- @workakkk

РКН: clck.ru/3FmxJF

#VRHSZ
Download Telegram
🚀 Высокопроизводительная библиотека CNN на C++20

MetalNet — это заголовочная библиотека для свёрточных нейронных сетей, написанная на C++20. Она обеспечивает производительность, сопоставимую с популярными фреймворками, благодаря нулевым накладным расходам, использованию DAG для автоматического дифференцирования и оптимизации под архитектуру процессора.

🚀 Основные моменты:
- Заголовочная библиотека без внешних зависимостей
- Поддержка AVX2 и OpenMP для многопоточности
- Имплицитная свёртка GEMM без избыточного использования памяти
- Оптимизированные алгоритмы для повышения производительности
- Сравнения производительности с PyTorch

📌 GitHub: https://github.com/KunwarPrabhat/CustomCNN

#cpp
🔥51
Коллекция библиотек и фреймворков для C++

Список удивительных фреймворков, библиотек, ресурсов и блестящих вещей на C++ (или C). Вдохновленный удивительными... вещами.

https://github.com/fffaraz/awesome-cpp
❤‍🔥73🔥1
🔥 C почти 20 лет притворялся, что RAII ему не нужен

В C++ деструкторы появились ещё в 1985 году. А C-разработчики десятилетиями продолжали писать ручной cleanup через goto, free, fclose и аккуратные прыжки в конец функции.

Но у GCC уже давно есть почти RAII-подобный механизм:

__attribute__((cleanup))

Он вызывает указанную функцию автоматически, когда переменная выходит из области видимости. Причём срабатывает не только в конце функции, но и при раннем return.

Пример:


__attribute__((cleanup(fclosep))) FILE *f = fopen(path, "r");
__attribute__((cleanup(freep))) char *buf = malloc(4096);

if (!f || !buf)
return -1;


После выхода из функции fclose и free вызовутся автоматически.

Эту технику используют в проектах вроде libvirt и QEMU, а в Linux kernel похожий подход начали активно принимать с 2023 года.

C всё ещё остаётся C, но иногда в нём внезапно появляются фичи, из-за которых старый goto cleanup выглядит как археология.
12👍7🫡2
⚡️ 1Password поднял цену индивидуального плана до $47,88 в год.

LastPass Premium стоит $36 в год.
Dashlane Premium - $59,88 в год.

И все это за одну базовую задачу: хранить строки текста в зашифрованном хранилище.

На этом фоне KeePassXC выглядит почти как антидот.

Это open-source парольный менеджер, который не требует аккаунта, подписки и доверия к очередному облачному сервису. Ваши пароли хранятся в одном .kdbx файле, который контролируете вы сами.

Что внутри:
- AES-256
- Argon2
- автозаполнение в браузерах
- TOTP/HOTP коды
- поддержка YubiKey и OnlyKey
- passkeys
- SSH agent для разработчиков
- Windows, macOS, Linux и BSD
- синхронизация через Dropbox, OneDrive, Nextcloud, Syncthing, флешку или что угодно

Главная магия в простоте: база паролей - это просто файл.

Если ваш облачный диск взломают, злоумышленник получит не список паролей, а зашифрованный blob. Мастер-пароль не уходит с вашего устройства.

KeePassXC развивается с 2016 года, имеет почти 27 тысяч звезд на GitHub, сотни контрибьюторов и полностью открытую GPLv2-лицензию.

На фоне индустрии, где парольные менеджеры превращаются в еще одну подписку, KeePassXC напоминает старую добрую идею:

- ваши пароли
- ваш файл
- ваш контроль


https://github.com/keepassxreboot/keepassxc
👍213🔥3🤷‍♂1
Doom запускался на 486-м процессоре с 4 МБ RAM ещё в 1993 году.

И самое интересное - весь мир игры рендерился через BSP-дерево, binary space partition tree.

Джон Кармак строил это дерево при загрузке уровня, а не на каждом кадре. Карта заранее делилась на области, а порядок отрисовки уже был сохранён внутри структуры.

Во время рендера движку не нужно было каждый раз заново вычислять видимость. Он просто проходил по дереву.

Как это работало:

• BSP-узел делит пространство на переднюю и заднюю часть
• если игрок спереди - сначала рендерится переднее поддерево
• если игрок сзади - сначала рендерится заднее поддерево
• порядок уже задан самой структурой дерева

Именно поэтому Doom не нуждался в z-buffer.

Корректная видимость появлялась не из трюков с глубиной, а из самого порядка обхода BSP-дерева.

Очень маленький код, но за ним стоит одна из самых красивых инженерных идей в истории игровых движков.
27👍16🥰1
В C есть трюк, который выглядит странно, но постоянно встречается в системном коде.

Структура может заканчиваться массивом без размера:

`int data[];`

Это называется flexible array member.

Смысл простой: размер массива задаётся не в объявлении структуры, а в момент выделения памяти.

Вместо двух отдельных аллокаций:

- отдельно структура;
- отдельно массив данных;

можно сделать одну непрерывную область памяти:

- заголовок объекта;
- сразу за ним данные переменной длины.

Пример:


`malloc(sizeof(Array) + n * sizeof(a->data[0]))`

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

Эта техника стандартизирована в C99 и активно используется в низкоуровневом коде, включая части Linux kernel.

Но есть важный нюанс: flexible array member должен быть последним полем структуры. После него уже нельзя добавлять другие поля, потому что массив физически “растёт” за пределы самой структуры.

C снова напоминает: язык почти ничего не скрывает, зато даёт прямой контроль над тем, как объект лежит в памяти.
👍269💯5🙈1💊1
This media is not supported in your browser
VIEW IN TELEGRAM
Этот проект содержит исходный код игр Command & Conquer: Tiberian Dawn и Command & Conquer: Red Alert, выпущенных как часть сборника Command & Conquer Remastered Collection.

Код распространяется под лицензией GPL v3 и предоставляет возможность энтузиастам и разработчикам модифицировать, изучать и использовать движок в рамках условий лицензии. В проекте используется C++ и множество современных практик разработки, а также система сборки CMake.

Репозиторий включает:

* Исходный код движка на C++
* Документацию по сборке
* Скрипты для интеграции с игрой
* Исторический контекст разработки

Проект ориентирован на обучение, поддержку моддинга и развитие сообщества вокруг классических RTS-игр.

https://github.com/electronicarts/CnC_Remastered_Collection
👍114
Деннис Ритчи создал C в начале 1970-х.

• Без Google.
• Без Stack Overflow.
• Без GitHub.
• Без Claude, Cursor и Codex.
• Без венчурного капитала, вирусного запуска и TED Talk.

Просто Bell Labs, терминал и задача: сделать язык, на котором можно писать операционные системы нормально.

Он создал язык, который помещался в килобайты.

Через 50 лет на его идеях всё ещё держится огромная часть цифрового мира:

- Linux kernel
- Windows
- macOS
- iOS
- Android
- embedded-системы
- базы данных
- компиляторы
- сетевой стек
- железо, которое работает годами без перезагрузки

C стал не просто языком.

Он стал нижним слоем современной разработки.

Python, Java, JavaScript, Go, Rust, C++ - все они так или иначе живут в тени решений, которые Ритчи заложил десятилетия назад.

Он умер в 2011 году, почти одновременно со Стивом Джобсом.

Джобс получил обложки.
Ритчи получил тишину.

Но если ты когда-либо писал код, запускал приложение, открывал браузер или держал смартфон в руках, ты почти точно пользовался миром, который помог построить Деннис Ритчи.

Некоторые люди создают продукты.

Ритчи создал фундамент.
103🫡30👍16🔥12👏6💯5
В nginx аллокатор памяти устроен почти как указатель, который двигается только вперёд.

Идея простая: под запрос выделяется пул памяти, а дальше nginx просто «отрезает» куски из большого блока по мере необходимости. Никаких сложных free lists, минимум накладных расходов на каждую аллокацию и меньше проблем с фрагментацией.

Пока запрос живёт, память только раздаётся вперёд. Когда запрос завершён, весь пул освобождается одним действием.

Почему это быстро:

- не нужно освобождать каждый маленький объект отдельно
- не нужно искать подходящий свободный блок
- нет постоянной борьбы с фрагментацией
- жизненный цикл памяти совпадает с жизненным циклом запроса
- код остаётся предсказуемым для CPU cache

Это хороший пример инженерного компромисса: nginx не пытается сделать универсальный malloc на все случаи жизни. Он использует знание своей нагрузки - много короткоживущих объектов внутри одного запроса - и делает под это максимально простой аллокатор.

Иногда самый быстрый менеджер памяти - это просто указатель, который идёт вперёд.
31👍4👌2🔥1
📓 Пять PDF по оптимизации, которые реально стоит сохранить.

Жёсткая база по тому, как код превращается в инструкции, как эти инструкции исполняются процессором и почему иногда «очевидно быстрый» вариант внезапно медленнее.

Что внутри:

1. Optimizing software in C++
179 страниц про оптимизацию C++ под Windows, Linux и macOS. Память, ветвления, компиляторы, SIMD, профилирование и типичные ошибки.

2. Optimizing subroutines in assembly language
156 страниц про x86 assembly. Полезно даже если вы не пишете на ассемблере, потому что после этого проще понимать, что делает компилятор.

3. The microarchitecture of Intel, AMD and VIA CPUs
277 страниц про устройство процессоров: pipeline, кеши, предсказание ветвлений, execution units и прочие вещи, которые напрямую влияют на скорость кода.

4. Instruction tables
485 страниц таблиц с latency, throughput и micro-ops для инструкций Intel, AMD и VIA. Это уже не чтение перед сном, а справочник для тех случаев, когда надо понять, где именно теряется производительность.

5. Calling conventions
60 страниц про calling conventions в разных C++ компиляторах и ОС. Пригодится для ABI, FFI, отладки, reverse engineering и низкоуровневого кода.

Ссылки:

https://agner.org/optimize/optimizing_cpp.pdf

https://agner.org/optimize/optimizing_assembly.pdf

https://agner.org/optimize/microarchitecture.pdf

https://agner.org/optimize/instruction_tables.pdf

https://agner.org/optimize/calling_conventions.pdf

Все пять одним архивом:

https://agner.org/optimize/optimization_manuals.zip

Главная страница:

https://agner.org/optimize/

Если хотите понимать performance не на уровне «ну там компилятор сам всё оптимизирует», а по-настоящему - это хороший старт.
12👍11🔥4💯1👻1
🔐 Стань этичным хакером - с нуля до Pro

Хочешь зарабатывать на поиске уязвимостей, а не бояться их? Этот курс проведёт тебя от первой команды в терминале до реальных техник пентеста.

Что внутри:
→ Разведка целей: nmap, curl, анализ заголовков
→ Криптография и разбор кода на практике
→ Эксплуатация уязвимостей и документирование находок
→ Только живые задачи — никакой воды
Без скучной теории. Только то, за что платят в bug bounty и на собеседованиях в InfoSec.

📈 От «что такое порт» — до отчёта пентестера за несколько недель.

👉 Записывайся на Stepik и начни взламывать легально уже сегодня.
2🔥2👍1
⚡️ Бинарный поиск, который вы выучили, скорее всего, был неправильным.

Джон Бентли опубликовал реализацию бинарного поиска в *Programming Pearls* после того, как доказал её корректность и протестировал.

Баг прожил почти 20 лет.

Позже Джошуа Блох нашёл точно такую же ошибку в реализации бинарного поиска, которую сам написал для JDK.

Исследование 1988 года показало: корректный бинарный поиск был только в 5 из 20 учебников.

Ошибка проявляется только на массивах размером 2^30 элементов и больше.

Проблема возникает при вычислении середины:


mid = (low + high) / 2;


На очень больших массивах low + high может вызвать переполнение.

Правильнее писать так:


mid = low + (high - low) / 2;


В C такое переполнение может привести к выходу за границы массива и непредсказуемому поведению. В Java это обычно заканчивается ArrayIndexOutOfBoundsException.

Та же ошибка затрагивала mergesort и огромное количество других алгоритмов «разделяй и властвуй».
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥63❤‍🔥2🥱2
📊 Минималистичная графовая база данных на C++17

TGDB — это простая графовая база данных, реализованная как статическая библиотека. Она поддерживает фиксированные узлы и индексные указатели, обеспечивая схему без схемы и работу с базовыми типами данных. База данных позволяет эффективно создавать и извлекать объекты с свойствами.

🚀Основные моменты:
- Унифицированный тип узла размером 56 байт.
- Поддержка встроенных типов: int, double, std::string.
- Двусторонние ссылки между узлами.
- Дисковая устойчивость через mmap.
- Быстрый локальный обход и глобальный поиск.

📌 GitHub: https://github.com/LincolnCox29/TrueGraphDataBase

#cpp
🤯54👍2🥰1😁1
C23 был-то добавилен checked integer arithmetic

В C долго приходилось руками писать однотипные helper-функции, чтобы безопасно проверять переполнение при сложении, вычитании или умножении.

Теперь в C23 для этого появился заголовок:


#include <stdckdint.h>

И функции вроде ckd_mul:

#include <stdckdint.h>
#include <stdint.h>
#include <stdio.h>

int main(void) {
int32_t price = 500000;
int32_t qty = 8000;
int32_t total;

if (ckd_mul(&total, price, qty)) {
puts("overflow caught, not shipped");
return 1;
}

printf("total: %d\n", total);
}


Смысл простой: если результат помещается в тип, он записывается в total.
Если произошло переполнение, функция возвращает true.

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

• размеры буферов
• цены и количества
• индексы
• длины массивов
• расчёт памяти
• сетевые пакеты
• парсеры бинарных форматов

Раньше такие проверки часто писали руками, и там легко ошибиться на границах типа.
Теперь стандартная библиотека даёт нормальный способ сказать: «умножь, но не дай мне случайно получить мусор из-за overflow».

Маленькое изменение в стандарте, но для системного кода очень приятное.
👍234🥰2
🧩 Эффективный менеджер памяти для C

rpmalloc — это кроссплатформенный, безблокировочный и кэшируемый аллокатор памяти, обеспечивающий 16-байтовое выравнивание. Он предлагает высокую производительность и простоту использования, что делает его отличной альтернативой популярным аллокаторам. Поддерживает множество платформ, включая Windows, Linux и macOS.

🚀Основные моменты:
- Быстрая работа без лишних накладных расходов.
- Легко настраиваемый API для управления памятью.
- Поддержка многопоточности с кэшированием.
- Публичная лицензия без ограничений на использование.

📌 GitHub: https://github.com/mjansson/rpmalloc

#c
🔥42
CUDA 13.3 - это не просто очередной апдейт тулкита NVIDIA, а шаг к более высокоуровневому GPU-программированию.

Главное изменение - CUDA Tile теперь доступен в C++. Это модель, где разработчик описывает вычисления через тайлы, а низкоуровневые детали вроде параллелизма, перемещения данных, асинхронности и работы с памятью берёт на себя компилятор. Для C++-команд это важно: можно встраивать tile-подход в существующие CUDA-кодовые базы, не переписывая всё вокруг нового DSL.

Что ещё добавили:

- CUDA Tile C++ для более компактных и переносимых GPU-кернелов
- поддержку Hopper с Compute Capability 9.0
- CompileIQ - автонастройку компилятора под конкретные кернелы
- CUDA Python 1.0 как стабильную версию Python-интерфейса к CUDA
- обновления для checkpointing, IPC и работы с контекстами
- улучшения для tensor interoperability

Самое интересное здесь не «ещё немного быстрее», а смена уровня абстракции. NVIDIA постепенно двигает CUDA от ручного управления потоками, памятью и синхронизацией к модели, где разработчик описывает вычисления, а компилятор сам ищет эффективный путь к железу.

Для AI-инфраструктуры это особенно важно. Кастомные кернелы для attention, GEMM и инференса остаются узким местом, но писать их руками дорого и сложно. CUDA 13.3 делает этот слой доступнее для C++, Python и production-команд, которые хотят выжимать производительность без полного погружения в низкоуровневую CUDA-магию.

NVIDIA явно строит не просто GPU, а полный стек: язык, компилятор, runtime, Python-интерфейсы и инструменты автооптимизации.

https://developer.nvidia.com/blog/nvidia-cuda-13-3-enhances-gpu-development-with-tile-programming-in-c-compiler-autotuning-and-python-updates
4👍1🔥1
На UNIX stdout - это просто файловый дескриптор 1.

И из-за этого можно поймать очень неприятный эффект: если закрыть stdout, следующий открытый файл может получить тот же дескриптор 1.

То есть код вроде этого:


close(1);
FILE *f = fopen("output.txt", "w");
printf("hello\n");


Может записать printf не в терминал, а прямо в output.txt.

Потому что система обычно выдаёт минимальный свободный файловый дескриптор. Закрыл 1 - значит он снова свободен. Открыл файл - он может стать новым stdout.

Мелочь, но именно из таких мелочей и состоит настоящее понимание UNIX.
👍175🥰2
☕️ Latte: Ultra-Low Latency C++ Telemetry Framework

Latte — это заголовочная библиотека C++ для телеметрии, предназначенная для высокочастотной торговли и реального времени. Она измеряет циклы ЦП с помощью таймеров x86_64 и использует фиксированные кольцевые буферы для хранения данных, минимизируя накладные расходы.

🚀Основные моменты:
- Высокая точность измерений в наносекундах.
- Поддержка до 64 активных слотов на поток.
- Три режима измерений: Fast, Mid и Hard.
- Без динамических аллокаций во время работы.
- Статистический анализ и очистка данных от выбросов.

📌 GitHub: https://github.com/MoonFlowww/Latte

#cpp
❤‍🔥7👍4🔥2🎉1
🗺️ Полный роадмап C++ 2026 — от нуля до профессионала

Это не просто список тем, а пошаговый маршрут превращения новичка в профессионального C++-разработчика. Каждый уровень даёт не только перечень концепций, но и рабочие примеры кода с пояснениями «как правильно» и «как неправильно», чтобы вы сразу видели идиоматичный современный C++, а не устаревшие практики из учебников 2000-х годов.

Роадмап построен по принципу «теория рядом с практикой»: сначала вы изучаете концепцию на коде из соответствующего уровня, а затем углубляете понимание в разделе.

📚 Теория C++, где каждая тема разобрана от базовой интуиции до тонкостей, важных на собеседованиях и в продакшене. Такой подход экономит месяцы: вы не зубрите оторванные факты, а понимаете, почему язык устроен именно так.

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

https://github.com/justxor/cpproadmap2026/tree/main
👍208😐2
🚀 CPrime: Новый язык программирования на основе C и C++

CPrime сочетает в себе скорость компиляции C и выразительность C++, минимизируя сложности последнего. Этот язык позволяет компилировать C-программы и многие C++ файлы, предлагая при этом удобные инструменты для структурирования кода.

🚀 Основные моменты:
- Высокая скорость компиляции, сопоставимая с C
- Поддержка объектно-ориентированного программирования
- Простота использования и совместимость с C
- Минимизация лишних сложностей C++
- Быстрая разработка и активное тестирование

📌 GitHub: https://github.com/LukeSchoen/CPrime
🤔15🤣11🍌2