C++ Academy
По всем вопросам- @workakkk РКН: clck.ru/3FmxJF #VRHSZ
نمایش بیشتر📈 تحلیل کانال تلگرام C++ Academy
کانال C++ Academy (@cpluspluc) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 15 492 مشترک است و جایگاه 8 087 را در دسته فناوری و برنامهها و رتبه 41 904 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 15 492 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 05 اکتبر, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -49 و در ۲۴ ساعت گذشته برابر 7 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 15.13% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 7.64% واکنش نسبت به کل مشترکان کسب میکند.
- دسترسی پستها: هر پست به طور میانگین 2 344 بازدید دریافت میکند. در اولین روز معمولاً 1 183 بازدید جمعآوری میشود.
- واکنشها و تعامل: مخاطبان بهطور فعال حمایت میکنند؛ میانگین واکنش به هر پست 20 است.
- علایق موضوعی: محتوا بر موضوعات کلیدی مانند c++, github, linux, api, архитектура تمرکز دارد.
📝 توضیح و سیاست محتوایی
نویسنده این فضا را محل بیان دیدگاههای شخصی توصیف میکند:
“По всем вопросам- @workakkk
РКН: clck.ru/3FmxJF
#VRHSZ”
به لطف بهروزرسانیهای پرتکرار (آخرین داده در تاریخ 06 اکتبر, 2026)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
i = 0x5f3759df - (i >> 1); // what the fuck?
Комментарий настоящий. Эта строка помогает вычислить 1/√x, не извлекая квадратный корень. В графике такая операция нужна для нормализации векторов: привести их длину к единице, сохранив направление.
Как работает трюк?
У float внутри есть показатель степени и дробная часть. Если прочитать биты положительного нормализованного числа как целое, получится величина, которая примерно соответствует его логарифму с масштабом и смещением.
А дальше используется свойство:
log₂(1/√x) = −½ × log₂(x)
Сдвиг >> 1 делит целое число на два. Вычитание из подобранной константы меняет знак и компенсирует смещение. Полученные биты снова читаются как float: это уже приближение к ответу.
Один шаг метода Ньютона доводит относительную погрешность примерно до 0,18%. В историческом тесте Криса Ломонта функция работала примерно в четыре раза быстрее прямого вычисления 1.0 / sqrt(x).
А закомментированная строка на картинке? Это второй шаг Ньютона: ещё больше точности за дополнительные вычисления.
💡 Красота алгоритма в том, что само представление числа в памяти становится частью вычисления.
https://github.com/id-Software/Quake-III-Arena/blob/master/code/game/q_math.c«На C легко выстрелить себе в ногу. На C++ это сделать сложнее, но если уж получится, оторвёт всю ногу целиком».В своём FAQ он объясняет: это верно для любого мощного языка. Чем лучше язык защищает от простых ошибок, тем менее очевидными становятся те, что остаются. C++ действительно закрыл многие дыры C: RAII, умные указатели, строгая типизация, а на слайде за его спиной видно, что код на C++20/23 бывает проще и безопаснее старого. Но шаблоны, неопределённое поведение и сложная модель памяти по-прежнему позволяют выстрелить так, что потом неделями ищешь, куда попало.
double при этом остаются обычными числами
В итоге одно 64-битное значение может представлять и число, и указатель, и другие типы данных.
Очень красивый пример того, как устройство IEEE 754 можно использовать для построения компактного рантайма языка.1 - байт загружается
- 0 - вместо него ставится ноль
Самое интересное начинается, когда маска полностью нулевая:
#include <x86intrin.h>
void f(const char *p) {
_mm512_maskz_loadu_epi8(0, p);
}
При нулевой маске память фактически не читается, а результатом становится 512-битный вектор из нулей.
То есть значение p в таком случае не влияет на результат, а компилятор при оптимизации вообще может удалить весь вызов.
Хороший пример того, насколько необычно работают masked-load инструкции в AVX-512.enum в C заметно удобнее для низкоуровневого кода.
Раньше базовый тип перечисления обычно выбирал компилятор, и enum часто занимал размер обычного int:
enum status {
OK = 0,
ERROR = -1
};
На многих системах это 4 байта.
В C23 можно явно указать базовый тип:
enum status8 : int8_t {
OK8 = 0,
ERR8 = -1
};
Теперь такой enum занимает 1 байт.
Можно и наоборот использовать большой тип:
enum status64 : uint64_t {
OK64 = 0,
ERR64 = UINT64_C(0xFFFFFFFFFFFFFFFF)
};
Это особенно полезно там, где важен точный layout структуры, ABI, сетевые протоколы, embedded и работа с бинарными форматами.
В C23 размер enum теперь можно контролировать явно, а не полагаться на выбор компилятора.
id ^ 1
Если id чётный, id ^ 1 даст следующее нечётное ребро. Если нечётный - вернёт предыдущее чётное.
MCMF пригодится там, где мало просто найти максимальный поток и у каждого решения есть цена:
• назначение сотрудников на задачи
• логистика
• маршрутизация
• matching с разной стоимостью
• распределение ресурсов
• расписания
Компактный пример того, как residual network, shortest path и greedy augmentation собираются в один мощный алгоритм.
int x = 10;
while (x --> 0) {
std::cout << x << '\n';
}
Никакого специального --> оператора в C++ тут нет.
Это просто:
x-- > 0
Сначала берётся текущее значение x и сравнивается с 0, а затем x уменьшается на единицу.
Поэтому код выведет:
9
8
7
6
5
4
3
2
1
0
Один из тех C++-трюков, который выглядит как отдельный оператор, хотя на самом деле это просто удачно поставленные -- и >.radiance().
Если дать рендеру тысячи samples per pixel, он собирает полноценный Cornell Box с зеркальной и стеклянной сферами.
Проект появился ещё в 2008 году и до сих пор отлично показывает базовую механику path tracing.HyperLogLog - вероятностный алгоритм оценки количества уникальных элементов.
Вместо хранения каждого значения он:
— хеширует элементы
— распределяет их по buckets
— отслеживает необычно длинные последовательности нулей в хэшах
— по этой статистике оценивает cardinality
Например, с 16384 регистрами можно оценивать даже огромные множества, занимая порядка десятков килобайт памяти.
При этом ошибка может оставаться около 1%.
Именно поэтому HyperLogLog любят в аналитике и больших данных: посчитать COUNT(DISTINCT ...) для миллиардов объектов можно без хранения миллиардов ID.
Магия тут не в точности до последнего элемента, а в очень хорошем компромиссе между памятью и результатом.constexpr и consteval. Один заголовочный файл, без зависимостей за пределами стандартной библиотеки.
Что можно делать при компиляции:
* Передавать строки в параметры шаблонов и собирать их из частей.
* Вычислять хеши.
* Получать имена типов без RTTI.
* Экранировать строки для JSON, URL и HTML.
* Проверять UTF-8 и преобразовывать его в UTF-16/UTF-32.
* Останавливать сборку с понятным сообщением при ошибке в данных.
Например, некорректный строковый литерал или недопустимое значение можно обнаружить ещё до запуска программы.
Требуется C++23: GCC 14+, Clang 19+ или свежий AppleClang.
Документация — https://constexprcore.github.io/useful_abstractions/slow двигается на 1 узел
fast — на 2
Если цикл есть, они обязательно встретятся.
После встречи один указатель возвращаем в head, а дальше оба двигаем по одному узлу. Следующая точка встречи — точное начало цикла.
Node *detect_cycle(Node *head) {
Node *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
slow = head;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return NULL;
}
Сложность:
O(n) по времени
O(1) по памяти
Один из самых красивых примеров того, как простая математика по модулю превращается в очень практичный алгоритм.