ch
Feedback
C++ Academy

C++ Academy

前往频道在 Telegram

По всем вопросам- @workakkk РКН: clck.ru/3FmxJF #VRHSZ

显示更多

📈 Telegram 频道 C++ Academy 的分析概览

频道 C++ Academy (@cpluspluc) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 15 520 名订阅者,在 技术与应用 类别中位列第 8 176,并在 俄罗斯 地区排名第 42 412

📊 受众指标与增长动态

невідомо 创建以来,项目保持高速增长,吸引了 15 520 名订阅者。

根据 25 八月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -45,过去 24 小时变化为 0,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 15.76%。内容发布后 24 小时内通常能获得 6.98% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 2 446 次浏览,首日通常累积 1 083 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 23
  • 主题关注点: 内容集中在 c++, github, linux, api, архитектура 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
По всем вопросам- @workakkk РКН: clck.ru/3FmxJF #VRHSZ

凭借高频更新(最新数据采集于 26 八月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

15 520
订阅者
无数据24 小时
+537
-4530
吸引订阅者
八月 '26
八月 '26
+100
在33个频道中
七月 '26
+82
在42个频道中
Get PRO
六月 '26
+56
在1个频道中
Get PRO
五月 '26
+130
在2个频道中
Get PRO
四月 '26
+49
在0个频道中
Get PRO
三月 '26
+92
在21个频道中
Get PRO
二月 '26
+93
在44个频道中
Get PRO
一月 '26
+437
在110个频道中
Get PRO
十二月 '25
+66
在2个频道中
Get PRO
十一月 '25
+217
在44个频道中
Get PRO
十月 '25
+81
在15个频道中
Get PRO
九月 '25
+116
在38个频道中
Get PRO
八月 '25
+291
在9个频道中
Get PRO
七月 '25
+518
在77个频道中
Get PRO
六月 '25
+347
在73个频道中
Get PRO
五月 '25
+82
在5个频道中
Get PRO
四月 '25
+105
在27个频道中
Get PRO
三月 '25
+120
在1个频道中
Get PRO
二月 '25
+175
在40个频道中
Get PRO
一月 '25
+175
在47个频道中
Get PRO
十二月 '24
+585
在58个频道中
Get PRO
十一月 '24
+1 337
在186个频道中
Get PRO
十月 '24
+2 234
在75个频道中
Get PRO
九月 '24
+848
在203个频道中
Get PRO
八月 '24
+580
在42个频道中
Get PRO
七月 '24
+837
在52个频道中
Get PRO
六月 '24
+2 266
在64个频道中
Get PRO
五月 '24
+498
在39个频道中
Get PRO
四月 '24
+571
在47个频道中
Get PRO
三月 '24
+653
在20个频道中
Get PRO
二月 '24
+907
在5个频道中
Get PRO
一月 '24
+705
在42个频道中
Get PRO
十二月 '23
+447
在39个频道中
Get PRO
十一月 '23
+162
在31个频道中
Get PRO
十月 '23
+224
在0个频道中
Get PRO
九月 '23
+385
在0个频道中
Get PRO
八月 '23
+2 329
在0个频道中
Get PRO
七月 '23
+498
在1个频道中
Get PRO
六月 '23
+565
在0个频道中
Get PRO
五月 '23
+5 320
在0个频道中
Get PRO
四月 '23
+126
在0个频道中
Get PRO
三月 '23
+422
在0个频道中
Get PRO
二月 '23
+707
在0个频道中
日期
订阅者增长
提及
频道
26 八月+2
25 八月+8
24 八月+8
23 八月+46
22 八月0
21 八月+3
20 八月+9
19 八月+1
18 八月0
17 八月+2
16 八月+3
15 八月+1
14 八月+1
13 八月0
12 八月+3
11 八月+1
10 八月+3
09 八月+1
08 八月+2
07 八月+1
06 八月0
05 八月0
04 八月+2
03 八月0
02 八月+1
01 八月+2
频道帖子
🖥 Большинство “простых” shuffle-алгоритмов дают кривой рандом Частая ошибка: for (int i = 0; i < n; i++) { int j = rand()
🖥 Большинство “простых” shuffle-алгоритмов дают кривой рандом Частая ошибка:

for (int i = 0; i < n; i++) {
    int j = rand() % n;
    swap(a[i], a[j]);
}
На вид всё нормально: каждый элемент случайно меняется местами с другим. Но проблема в вероятностях. Для массива из n элементов существует n! перестановок. Хороший shuffle должен давать каждой перестановке одинаковый шанс. Наивный вариант делает n шагов, и на каждом шаге выбирает индекс из полного диапазона 0..n-1. В итоге некоторые перестановки появляются чаще других. Правильный подход - Fisher-Yates shuffle:

for (int i = n - 1; i > 0; i--) {
    int j = random(0, i);
    swap(a[i], a[j]);
}
Идея простая: на каждом шаге мы выбираем элемент только из ещё не зафиксированной части массива. Сначала выбираем последний элемент из всего массива. Потом предпоследний - из оставшихся. Потом следующий - из ещё меньшего диапазона. Так каждая перестановка получает одинаковую вероятность. В C++ лучше не писать через rand() % n, потому что там может быть ещё и modulo bias. Нормальный вариант:

std::mt19937 rng(std::random_device{}());

for (int i = n - 1; i > 0; --i) {
    std::uniform_int_distribution<int> dist(0, i);
    int j = dist(rng);
    std::swap(a[i], a[j]);
}
Shuffle - хороший пример, где код может выглядеть “рандомным”, но математически быть неправильным.

2
В C есть синтаксис, который выглядит как опечатка: case '0' ... '9': Кажется, что такой switch вообще не должен компилировать
В C есть синтаксис, который выглядит как опечатка: case '0' ... '9': Кажется, что такой switch вообще не должен компилироваться. Но в GCC это работает. Это расширение называется case ranges — можно задавать сразу диапазон значений внутри case. Например: case '0' ... '9': return DIGIT; case 'a' ... 'z': case 'A' ... 'Z': return LETTER; Вместо десяти отдельных case для цифр и ещё десятков для букв — одна строка на диапазон. Но есть нюанс: это не стандартный C, а расширение GCC. Если код должен быть переносимым между компиляторами, на такой синтаксис лучше не рассчитывать. Одна из тех возможностей C, которые выглядят неправильно, пока не узнаешь, что компилятор действительно это поддерживает.
1 767
3
Одна строка C, которая может сломать вам логику В C порядок вычисления аргументов функции не определён. foo(i++, i++); Из-за
Одна строка C, которая может сломать вам логику В C порядок вычисления аргументов функции не определён. foo(i++, i++); Из-за этого один и тот же код может дать разный результат: * gcc: foo(1, 0) * clang: foo(0, 1) Причина простая: компиляторы по-разному вычисляют аргументы. Такие вещи годами становились источником очень неприятных багов. Хорошая новость: сейчас -Wall обычно умеет это подсветить. Вывод банальный, но важный: не пишите код, который зависит от порядка вычисления аргументов.
1 896
4
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку Окружение решает больше, чем кажется. Собрал папки и каналы, где можн
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку Окружение решает больше, чем кажется. Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре. AI: t.me/ai_machinelearning_big_data Python: t.me/pythonl Linux: t.me/linuxacademiya Хакинг: t.me/linuxkalii DevOps: t.me/DevOPSitsec Docker: https://t.me/+90Z5TAyfuNU5YmRi Golang: t.me/Golang_google Rust: t.me/rust_code C++: t.me/cpluspluc C#: t.me/csharp_1001_notes Java: t.me/javatg JavaScript: t.me/javascriptv React: t.me/react_tg Frontend: t.me/front PHP: t.me/phpshka Android: t.me/android_its Мобильная разработка: t.me/mobdevelop Базы данных: t.me/sqlhub Data Science: t.me/data_analysis_ml Big Data: t.me/bigdatai Математика: t.me/data_math Физика: t.me/fizmat Kubernetes: t.me/kubernetc GameDev: https://t.me/gamedev Haskell: t.me/haskell_tg Собеседования и карьера: DS собеседования: t.me/machinelearning_interview Python собеседования: t.me/python_job_interview Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy Папка ML: https://t.me/addlist/2Ls-snqEeytkMDgy Папка Frontend: https://t.me/addlist/mzMMG3RPZhY2M2Iy Полезное сверху: ИТ-мемы: t.me/memes_prog Английский для программистов: t.me/english_forprogrammers ИИ и технологии: t.me/vistehno 954 ГБ open-source курсов: https://t.me/+rKBQEMccAA01MTcy ИТ-книги бесплатно: https://t.me/addlist/BkskQciUW_FhNjEy Max Ai: https://max.ru/ai_machinelearning_big_data Max python: https://max.ru/pythonl ТЕХНО: https://max.ru/vistehno Max Go: https://max.ru/Golang_google Max Linux: https://max.ru/linuxkalii Devops: https://max.ru/DevOPSitsec C#: https://max.ru/csharp_ci C++: https://max.ru/cpluspluc SQL: https://max.ru/sqlhub Java: https://max.ru/javatg Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
1 658
5
Кто-то под именем Сатоши Накамото в 2008 году опубликовал идею, из которой выросла целая индустрия майнинга с огромным энерго
Кто-то под именем Сатоши Накамото в 2008 году опубликовал идею, из которой выросла целая индустрия майнинга с огромным энергопотреблением. И до сих пор никто достоверно не знает, кто скрывается за этим именем. При этом сама базовая идея Proof of Work выглядит почти примитивно: берём число nonce, меняем его снова и снова, каждый раз считаем хэш и проверяем, попал ли результат ниже нужного target. Условно это выглядит так: uint32_t nonce = 0; while (1) { header.nonce = nonce; hash = sha256(sha256(header)); if (hash < target) break; nonce++; } То есть майнинг Bitcoin в основе своей это гигантский перебор чисел с постоянным пересчётом SHA-256. Простой цикл, который в итоге породил ASIC-фермы, энергопотребление в масштабах стран и индустрию на миллиарды долларов.
1 898
6
🖥 C++26 закрывает одну из самых больных тем lock-free кода - безопасное удаление памяти. Проблема не в atomics. Проблема в т
🖥 C++26 закрывает одну из самых больных тем lock-free кода - безопасное удаление памяти. Проблема не в atomics. Проблема в том, что один поток уже убрал узел из структуры, а другой всё ещё может его читать. Удалишь слишком рано, получишь use-after-free. Поэтому в C++26 стандартизируют Hazard Pointers. Идея простая: поток заранее помечает объект как “я сейчас его читаю”. Пока хотя бы один reader держит такой hazard pointer, объект нельзя удалять. Удаление откладывается до момента, когда все читатели закончат работу. Это делает lock-free структуры вроде стеков, очередей и списков намного безопаснее. Lock-free программирование становится не магией, а чуть более нормальным инженерным инструментом.
2 408
7
Приглашаем на бесплатный открытый вебинар курса «Программист С»: «С без компромиссов: обработка ошибок и полиморфизм» Когда:
Приглашаем на бесплатный открытый вебинар курса «Программист С»: «С без компромиссов: обработка ошибок и полиморфизм» Когда: 25 августа, 20:00 (мск) Язык С даёт полный контроль над памятью и железом, но за эту мощь приходится платить — в нём нет встроенных исключений и классов. Однако, это не значит, что отказоустойчивость и гибкость недоступны. На вебинаре разберём техники, которые обычно остаются за кадром, и покажем, как писать на С надёжно, масштабируемо и без ущерба для производительности. Что будет на вебинаре: Рассмотрим setjmp/longjmp — аналог исключений, который позволяет «телепортироваться» сквозь стек вызовов; Создадим виртуальные таблицы (vtable) — руками реализуем полиморфизм, как в C++; Соединим обе техники в одном проекте – создадим систему логирования с централизованной обработкой ошибок. Зарегистрироваться https://otus.pw/bn4O/?erid=2W5zFJBY3jX Бесплатное занятие приурочено к старту курса «Программист С» Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
1 229
8
⚡️ Linux может освободить RAM, не уничтожая сам диапазон виртуальной памяти процесса. Это как раз то, что делает madvise(MADV
⚡️ Linux может освободить RAM, не уничтожая сам диапазон виртуальной памяти процесса. Это как раз то, что делает madvise(MADV_DONTNEED) для anonymous mappings. Сценарий такой: char *region = mmap(NULL, GB, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); // потрогали часть страниц madvise(region, GB, MADV_DONTNEED); После madvise виртуальные адреса остаются валидными. Процесс всё ещё «видит» тот же диапазон памяти. Но физические страницы, которые стояли за этим диапазоном, ядро может забрать обратно. То есть адресное пространство осталось, а реальная RAM освободилась. При следующем обращении к этому участку процесс получит свежие zero-filled страницы. Старых данных там уже не будет. Почему это полезно: * можно держать большой виртуальный регион без постоянного удержания RAM * аллокаторы могут возвращать неиспользуемые страницы ядру * long-running процессы меньше раздувают RSS * память можно переиспользовать без полного munmap и нового mmap Важная деталь: MADV_DONTNEED не означает «удали адреса». Это скорее сигнал ядру: «эти страницы мне сейчас не нужны, можешь забрать физическую память». Адреса остаются. Страницы уходят. Следующее чтение приносит нули.
2 081
9
⚙️ Обычный strcat() в цикле может незаметно превратить простую склейку строк в O(n²). Причина в том, что strcat() при каждом
⚙️ Обычный strcat() в цикле может незаметно превратить простую склейку строк в O(n²). Причина в том, что strcat() при каждом вызове сначала ищет конец уже собранной строки. Чем длиннее буфер, тем больше данных приходится повторно проходить. Например: for (int i = 0; i < 100000; i++) strcat(buf, "chunk"); В бенчмарке сборка строки примерно на 1 МБ заняла около 4,1 секунды. Если же заранее выделить буфер и просто хранить текущую позицию записи: char *p = buf; for (int i = 0; i < 100000; i++) { memcpy(p, "chunk", 5); p += 5; } тот же объём собирается примерно за 0,4 мс. Разница больше чем в 10 000 раз. Мелочь, которую легко пропустить: проблема не в копировании строки, а в постоянном повторном поиске её конца.
1 812
10
⚡️ Fenwick Tree держится на одном битовом трюке Fenwick Tree, или Binary Indexed Tree, считает prefix sums за O(log n). Вся м
⚡️ Fenwick Tree держится на одном битовом трюке Fenwick Tree, или Binary Indexed Tree, считает prefix sums за O(log n). Вся магия в операции: i & -i Она находит младший установленный бит числа. Почему это работает? В two’s complement число -i получается как инверсия битов i плюс 1. Когда мы делаем i & -i, остаётся только самый правый бит, равный 1. Например: i = 12 // 1100 -i // 0100 в нужной маске i & -i = 4 Именно это значение говорит Fenwick Tree, на сколько нужно прыгнуть по индексам. Для обновления: for (; i < MAXN; i += i & -i) tree[i] += v; Мы идём вверх по структуре и обновляем все узлы, которые покрывают этот индекс. Для запроса суммы: for (; i > 0; i -= i & -i) s += tree[i]; Мы идём вниз и собираем нужные блоки суммы. Одна и та же операция управляет двумя направлениями: * i += i & -i — перейти к следующему ответственному узлу * i -= i & -i — убрать последний блок из prefix sum Поэтому Fenwick Tree такой компактный: никаких явных рёбер, указателей и рекурсии. Только массив и битовая арифметика. Красота структуры в том, что дерево как бы спрятано внутри двоичного представления индекса.
1 933
11
📚 Библиотека для работы с SQLite в C++26 с использованием рефлексии Reflite — это библиотека на C++26, которая упрощает взаи
📚 Библиотека для работы с SQLite в C++26 с использованием рефлексии Reflite — это библиотека на C++26, которая упрощает взаимодействие с SQLite, позволяя использовать обычные структуры как основу для выполнения запросов. Она поддерживает основные операции: вставка, удаление, выборка и обновление, избавляя от лишнего шаблона кода. 🚀 Основные моменты: - Легковесная библиотека в одном файле - Поддержка операций INSERT, DELETE, SELECT, UPDATE - Использует рефлексию для работы с типами структур - Не требует полной реализации SQL, фокус на простоте - Совместима с современными компиляторами C++26 📌 GitHub: https://github.com/KaruroChori/reflite #cpp
2 142
12
💡 Clang умеет показывать AST, и это один из лучших способов реально понять, что компилятор видит в вашем C/C++ коде. 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
2 570
13
🎶 Оптимизированный аудиовизуализатор для Windows Spectrum — это легковесный аудиовизуализатор на C++, который обрабатывает звук в реальном времени и выводит его в консоль без разрывов экрана. Он использует FFTW3 для анализа аудиосигналов и обеспечивает точное визуальное представление частот. 🚀 Основные моменты: - Реализация на C++17 для Windows. - Низкое использование CPU и памяти. - Поддержка WASAPI для захвата системного звука. - Отображение в виде ASCII-графиков. - Легкий в использовании и установке. 📌 GitHub: https://github.com/majockbim/spectrum #cpp
2 585
14
⚡️ Один `static` - три разных смысла. Добро пожаловать в C. В C ключевое слово static меняет поведение в зависимости от того,
⚡️ Один `static` - три разных смысла. Добро пожаловать в C. В 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
3 113
15
⚡️ Генератор случайных чисел всего из трёх XOR и сдвигов В 2003 году Джордж Марсалья представил xorshift - один из самых прос
⚡️ Генератор случайных чисел всего из трёх XOR и сдвигов В 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
2 698
16
Keylogger в несколько строк C? Почти. На самом деле это не «магия взлома», а raw mode в терминале. Обычно терминал ждёт Enter
Keylogger в несколько строк C? Почти. На самом деле это не «магия взлома», а raw mode в терминале. Обычно терминал ждёт Enter и сам обрабатывает ввод. А здесь программа отключает echo и canonical mode, поэтому видит каждое нажатие сразу. Именно так работают редакторы, TUI-приложения и терминальные игры. Важно: использовать только на своём вводе и в учебных целях. Перехват чужих клавиш - уже не программирование, а нарушение безопасности.
2 370
17
Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней! 8 августа в Коломенском пройдет ИТ-Пикник. В программе
Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней! 8 августа в Коломенском пройдет ИТ-Пикник. В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы. А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут. Зарегистрироваться и узнать подробности можно на сайте мероприятия. В билет входит +1 — можно позвать близких и друзей. До встречи в месте притяжения ИТ.
2 535
18
Четыре строки делают сложение `float` заметно точнее При последовательном сложении чисел с плавающей точкой часть младших бит
Четыре строки делают сложение `float` заметно точнее При последовательном сложении чисел с плавающей точкой часть младших битов теряется из-за округления. На больших массивах эта ошибка постепенно накапливается. Алгоритм Кэхэна хранит потерянную часть в отдельной переменной и компенсирует её на следующем шаге: float kahanSum(const float *nums, int count) { float sum = 0.0f; float correction = 0.0f; for (int i = 0; i < count; ++i) { float adjusted = nums[i] - correction; float next = sum + adjusted; correction = (next - sum) - adjusted; sum = next; } return sum; } Здесь correction запоминает ошибку округления, которая потерялась при предыдущем сложении. Обычная сумма быстрее, но Kahan Summation полезен там, где важна численная точность: - научные расчёты; - статистика и аналитика; - графика и симуляции; - обработка больших массивов; - накопление очень маленьких значений рядом с большими. Метод предложил Уильям Кэхэн в 1965 году. Небольшое усложнение цикла может заметно уменьшить ошибку без перехода на более тяжёлый числовой тип.
2 501
19
Оператор # в препроцессоре C превращает токены в строковые литералы ещё на этапе компиляции. Никакого преобразования во время
Оператор # в препроцессоре C превращает токены в строковые литералы ещё на этапе компиляции. Никакого преобразования во время выполнения не происходит. Ядро Linux использует этот трюк в макросах вроде WARN_ON(), чтобы вывести точное условие, которое не прошло проверку. Вы пишете выражение один раз, а препроцессор автоматически генерирует соответствующую строку. Один оператор - и ваши debug-сообщения остаются идеально синхронизированы с кодом.
2 303
20
LEA в x86 выглядит как инструкция для адресов, но компиляторы часто используют её как скрытый калькулятор. Формально LEA счит
LEA в x86 выглядит как инструкция для адресов, но компиляторы часто используют её как скрытый калькулятор. Формально LEA считает адрес без обращения к памяти: lea eax, [rdi + 3] Но по факту это обычная арифметика: return x + 3; Ещё хитрее: lea eax, [rdi + rdi*4] Это уже: return x * 5; Почему так делают? Потому что x86-адресация умеет base + index * scale + offset, а LEA позволяет использовать эту механику без чтения памяти. Бонус: LEA не трогает флаги процессора, в отличие от add. Красота C и asm в том, что за простой строкой x * 5 может стоять не mul, а маленький трюк архитектуры.
2 242