🕹️ Game Engine С++
01. Game Engine hardCORE серии. Promo
02. Сборка C++ проектов. Препроцессинг.
03. Сборка C++ проектов. Компиляция. Ассемблер. Теория.
04. Сборка C++ проектов. Оптимизации компилятора. Inline, constexpr, alignment.
05. Сборка C++ проектов. Linker. Forward declaration.
06. Сборка C++ проектов. Static/dynamic libraries. PCH. Unity (JUMBO) build.
📌 источник
#cpp #programming #ue5 #unrealengine
@cpluspluc
01. Game Engine hardCORE серии. Promo
02. Сборка C++ проектов. Препроцессинг.
03. Сборка C++ проектов. Компиляция. Ассемблер. Теория.
04. Сборка C++ проектов. Оптимизации компилятора. Inline, constexpr, alignment.
05. Сборка C++ проектов. Linker. Forward declaration.
06. Сборка C++ проектов. Static/dynamic libraries. PCH. Unity (JUMBO) build.
📌 источник
#cpp #programming #ue5 #unrealengine
@cpluspluc
🔥17👍5❤3❤🔥1🤔1
📌 Git Revert vs Git Reset: В чём разница? 🔄
Когда вы делаете ошибку в Git, важно понимать, как правильно её исправить. Два самых популярных способа —
### 🔹 Git Revert
- Создаёт новый коммит, который отменяет изменения из проблемного коммита.
- История сохраняется полностью — всё видно, даже ошибка.
- Безопасный вариант для публичных веток (например, `main`).
- Не удаляет коммиты — просто "откатывает" их эффект.
> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C4: Revert C3
> Результат: ошибка отменена, но история остаётся полной.
🔹 Git Reset
- Удаляет коммит(ы) из истории.
- Изменяет историю репозитория — может быть опасно, если уже был пуш.
- Подходит только для локальных изменений или ещё не опубликованных коммитов.
- Есть три режима:
> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C3 убрано
> Результат: история обрезана, как будто коммит никогда не был.
💡 Вывод:
📌 Понимание этих команд — ключ к уверенной работе с Git!
#Git #DevOps #Programming #junior
Когда вы делаете ошибку в Git, важно понимать, как правильно её исправить. Два самых популярных способа —
git revert и git reset. Но они работают по-разному!### 🔹 Git Revert
- Создаёт новый коммит, который отменяет изменения из проблемного коммита.
- История сохраняется полностью — всё видно, даже ошибка.
- Безопасный вариант для публичных веток (например, `main`).
- Не удаляет коммиты — просто "откатывает" их эффект.
> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C4: Revert C3
> Результат: ошибка отменена, но история остаётся полной.
🔹 Git Reset
- Удаляет коммит(ы) из истории.
- Изменяет историю репозитория — может быть опасно, если уже был пуш.
- Подходит только для локальных изменений или ещё не опубликованных коммитов.
- Есть три режима:
soft, mixed, hard.> 💡 Пример:
> C1 → C2 → C3 (ошибка) → C3 убрано
> Результат: история обрезана, как будто коммит никогда не был.
💡 Вывод:
revert — безопасный и прозрачный способ отменить изменения. reset — мощный инструмент, но требует осторожности.📌 Понимание этих команд — ключ к уверенной работе с Git!
#Git #DevOps #Programming #junior
👍26❤6🥰1
Data-Parallel Types: алгоритмы (C++26)
Библиотека «data-parallel types» для SIMD-векторов (пространство имён
-
-
- Автор отмечает, что строка
-
- Показаны два примера: ограничение к диапазону
Итог
- Для SIMD-векторов доступны привычные «минимумы/максимумы» и покомпонентный
-
- Дальше автор планирует разбирать новые возможности C++26 (в частности, контракты).
https://www.modernescpp.com/index.php/data-parallel-types-algorithms/
#cpp #programming
Библиотека «data-parallel types» для SIMD-векторов (пространство имён
std::experimental, алиас stdx) предоставляет четыре специальных алгоритма: `min, max, minmax и clamp. min, max, minmax-
min(a, b) и max(a, b) принимают два SIMD-вектора и возвращают вектор покомпонентных минимумов/максимумов.-
minmax(a, b) возвращает пару SIMD-векторов: первый — покомпонентные минимумы, второй — максимумы.- Автор отмечает, что строка
stdx::minmax(a, b) у него не компилировалась ни в GCC, ни в Clang (на момент публикации). clamp-
stdx::clamp(v, lo, hi) применяет std::clamp к каждому элементу SIMD-вектора: значения ниже lo поднимаются до нижней границы, выше hi — опускаются до верхней.- Показаны два примера: ограничение к диапазону
INT8_MIN..INT8_MAX и к 0..UINT8_MAX; на выводах видно, как выходящие за пределы элементы прижимаются к границам. Итог
- Для SIMD-векторов доступны привычные «минимумы/максимумы» и покомпонентный
clamp.-
minmax задуман как удобный возврат пары (min/max), но в текущих компиляторах может не собираться.- Дальше автор планирует разбирать новые возможности C++26 (в частности, контракты).
https://www.modernescpp.com/index.php/data-parallel-types-algorithms/
#cpp #programming
👍8❤4🔥1
Media is too big
VIEW IN TELEGRAM
Веселье с type erasure: делаем обертку с семантикой значения для полиморфных типов
Павел Новиков
Цель доклада — познакомить с подноготной базовой реализации type erasure (т.н. «стирание типов») в C++, а также придать уверенности при возможном взаимодействии с подобным кодом.
Используя реализацию обертки с семантикой значения в качестве примера, мы посмотрели на то, как работает type erasure, похожий на std::any.
В отличие от повсеместно используемой семантики указателя или ссылки, в данном случае обертка с семантикой значения позволяет нам обращаться с полиморфными объектами со «стертыми типами» как с обычными значениями: перемещать их, копировать, присваивать новые значения, при этом всей головной болью владения (ownership) и клонирования объекта исходного типа займётся реализация «за кулисами».
источник
#cpp #programming
Павел Новиков
Цель доклада — познакомить с подноготной базовой реализации type erasure (т.н. «стирание типов») в C++, а также придать уверенности при возможном взаимодействии с подобным кодом.
Используя реализацию обертки с семантикой значения в качестве примера, мы посмотрели на то, как работает type erasure, похожий на std::any.
В отличие от повсеместно используемой семантики указателя или ссылки, в данном случае обертка с семантикой значения позволяет нам обращаться с полиморфными объектами со «стертыми типами» как с обычными значениями: перемещать их, копировать, присваивать новые значения, при этом всей головной болью владения (ownership) и клонирования объекта исходного типа займётся реализация «за кулисами».
источник
#cpp #programming
❤3🔥2😁1
This media is not supported in your browser
VIEW IN TELEGRAM
🐦 Flappy Bird на Си: Вес APK < 100 Килобайт! 🚀
В сентябре 2024 года, увидев Flappy Bird на C# в дискорд-канале Raylib, я решил попробовать реализовать эту игру на Си для Android с весом APK менее 100 КБ. 🚀
Идея казалась безумной, но спортивный интерес взял верх. 💪
https://github.com/VadimBoev/FlappyBird
#cpp #programming
В сентябре 2024 года, увидев Flappy Bird на C# в дискорд-канале Raylib, я решил попробовать реализовать эту игру на Си для Android с весом APK менее 100 КБ. 🚀
Идея казалась безумной, но спортивный интерес взял верх. 💪
https://github.com/VadimBoev/FlappyBird
#cpp #programming
👍8❤5🔥3
C умел «объектный стиль» задолго до модных споров про ООП.
В Linux-драйверах это видно особенно хорошо. Каждый драйвер фактически реализует интерфейс, просто заполняя структуру с указателями на функции.
file_operations из include/linux/fs.h - хороший пример. Ядро говорит: вот набор операций, которые может поддерживать файл, сокет или устройство. Драйвер сам решает, какие обработчики дать:
open
read
write
release
mmap
fsync
unlocked_ioctl
Если операция не нужна, поле остаётся NULL, и ядро использует поведение по умолчанию там, где это возможно.
По сути это тот же контракт между системой и реализацией, только без классов, наследования и рантаймовой магии. Есть таблица функций, есть объект, есть набор действий, которые с ним можно выполнить.
Именно поэтому C до сих пор живёт в ядрах, драйверах и системном коде. Он не навязывает модель абстракций, но даёт достаточно низкоуровневых инструментов, чтобы собрать нужную модель самому.
Просто вместо красивого слова interface у тебя struct с function pointers.
#programming #linux #c
В Linux-драйверах это видно особенно хорошо. Каждый драйвер фактически реализует интерфейс, просто заполняя структуру с указателями на функции.
file_operations из include/linux/fs.h - хороший пример. Ядро говорит: вот набор операций, которые может поддерживать файл, сокет или устройство. Драйвер сам решает, какие обработчики дать:
open
read
write
release
mmap
fsync
unlocked_ioctl
Если операция не нужна, поле остаётся NULL, и ядро использует поведение по умолчанию там, где это возможно.
По сути это тот же контракт между системой и реализацией, только без классов, наследования и рантаймовой магии. Есть таблица функций, есть объект, есть набор действий, которые с ним можно выполнить.
Именно поэтому C до сих пор живёт в ядрах, драйверах и системном коде. Он не навязывает модель абстракций, но даёт достаточно низкоуровневых инструментов, чтобы собрать нужную модель самому.
Просто вместо красивого слова interface у тебя struct с function pointers.
#programming #linux #c
👍17❤11🥰2🥱1
В 2003 году Джордж Марсалья представил xorshift - один из самых простых и быстрых генераторов псевдослучайных чисел.
Классический
xorshift32:
uint32_t xorshift32(void)
{
state ^= state << 13;
state ^= state >> 17;
state ^= state << 5;
return state;
}
Фактически весь алгоритм:
shift → XOR
shift → XOR
shift → XOR
При ненулевом начальном
state период может достигать:
2³² - 1
Никаких умножений, делений или тяжёлой математики, поэтому подобные RNG отлично подходят для игр, симуляций и procedural generation, где важна скорость.
Но есть нюанс: xorshift нельзя использовать для криптографии. Его внутреннее состояние можно предсказать, поэтому для ключей, паролей и токенов нужны криптографически стойкие генераторы.
Иногда действительно полезный алгоритм помещается буквально в три строки.
#Programming #Algorithms #C #Random
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20🔥8👍2🥰1
⚡️ Один `static` - три разных смысла. Добро пожаловать в C.
В C ключевое слово
### 1.
Переменная имеет internal linkage - она доступна только внутри текущего
Это удобный способ спрятать детали реализации модуля.
### 2.
Он существует всё время работы программы и сохраняет значение между вызовами функции.
### 3.
Функция становится видна только внутри текущего translation unit.
Другой
Итого:
🔥 Поэтому
lifetime и linkage.
#C #Programming #SystemsProgramming #LowLevel #Cpp
В C ключевое слово
static меняет поведение в зависимости от того, где именно оно написано.### 1.
static у глобальной переменной
static int global;
Переменная имеет internal linkage - она доступна только внутри текущего
.c файла.Это удобный способ спрятать детали реализации модуля.
### 2.
static внутри функции
void foo(void) {
static int count;
count++;
}
count не создаётся заново при каждом вызове.Он существует всё время работы программы и сохраняет значение между вызовами функции.
foo(); // count = 1
foo(); // count = 2
foo(); // count = 3
### 3.
static у функции
static void bar(void) {
}
Функция становится видна только внутри текущего translation unit.
Другой
.c файл вызвать bar() напрямую уже не сможет.Итого:
static global variable -> скрыть символ внутри файла
static local variable -> сохранить состояние между вызовами
static function -> скрыть функцию внутри файла
🔥 Поэтому
static в C полезнее воспринимать не как одно конкретное поведение, а как подсказку проверить две вещи:lifetime и linkage.
#C #Programming #SystemsProgramming #LowLevel #Cpp
👍16🔥9❤6❤🔥1
💡 Clang умеет показывать AST, и это один из лучших способов реально понять, что компилятор видит в вашем C/C++ коде.
AST — это Abstract Syntax Tree, внутреннее представление программы после парсинга.
Например, простой код:
для компилятора — не просто строка текста, а дерево примерно такого смысла:
Именно через такое представление компилятор понимает структуру выражений, типы, области видимости и то, какие преобразования можно выполнить дальше.
У Clang AST можно получить напрямую:
А в Compiler Explorer / Godbolt есть отдельный режим просмотра AST, поэтому можно менять код и сразу видеть, как перестраивается дерево.
Особенно полезно разбирать так:
* шаблоны;
* перегрузку функций;
* implicit conversions;
*
* лямбды;
* range-based
* временные объекты;
* разные формы инициализации.
Если регулярно смотреть AST, C++ постепенно перестаёт выглядеть как набор «магических правил».
Начинаешь видеть код примерно так, как его видит компилятор.
🔗
#Cpp #Clang #Compiler #Programming
AST — это Abstract Syntax Tree, внутреннее представление программы после парсинга.
Например, простой код:
int x = a + b * 2;
для компилятора — не просто строка текста, а дерево примерно такого смысла:
VarDecl
└── BinaryOperator +
├── a
└── BinaryOperator *
├── b
└── 2
Именно через такое представление компилятор понимает структуру выражений, типы, области видимости и то, какие преобразования можно выполнить дальше.
У Clang AST можно получить напрямую:
clang++ -Xclang -ast-dump -fsyntax-only main.cpp
А в Compiler Explorer / Godbolt есть отдельный режим просмотра AST, поэтому можно менять код и сразу видеть, как перестраивается дерево.
Особенно полезно разбирать так:
* шаблоны;
* перегрузку функций;
* implicit conversions;
*
auto;* лямбды;
* range-based
for;* временные объекты;
* разные формы инициализации.
Если регулярно смотреть AST, C++ постепенно перестаёт выглядеть как набор «магических правил».
Начинаешь видеть код примерно так, как его видит компилятор.
🔗
https://godbolt.org/z/cfc7h41bT#Cpp #Clang #Compiler #Programming
👍19🔥8🥰4❤2💯1
📚 Отличная подборка материалов по современному C++
На Modernes C++ собрали большой структурированный каталог статей по языку - от базовых концепций до сложных тем из современного стандарта.
Что есть внутри:
- templates и metaprogramming;
- concurrency и multithreading;
- smart pointers и управление ресурсами;
- ranges, concepts и coroutines;
- STL и алгоритмы;
- memory model;
- best practices и типичные ошибки;
- новые возможности C++20/23 и дальше.
Удобно, что это не набор случайных постов, а фактически большая карта тем по современному C++.
Хороший ресурс, если хочется системно закрыть пробелы и глубже понять, как язык работает под капотом.
https://modernescpp.com/index.php/table-of-content/
#Cpp #CPlusPlus #Programming #STL #ModernCpp
На Modernes C++ собрали большой структурированный каталог статей по языку - от базовых концепций до сложных тем из современного стандарта.
Что есть внутри:
- templates и metaprogramming;
- concurrency и multithreading;
- smart pointers и управление ресурсами;
- ranges, concepts и coroutines;
- STL и алгоритмы;
- memory model;
- best practices и типичные ошибки;
- новые возможности C++20/23 и дальше.
Удобно, что это не набор случайных постов, а фактически большая карта тем по современному C++.
Хороший ресурс, если хочется системно закрыть пробелы и глубже понять, как язык работает под капотом.
https://modernescpp.com/index.php/table-of-content/
#Cpp #CPlusPlus #Programming #STL #ModernCpp
👍12❤3🔥2