uk
Feedback
Библиотека С# С++

Библиотека С# С++

Відкрити в Telegram

https://t.me/+WgGTjeH0p1NjMDFi - ссылка на канал По всем вопросам- @workakkk @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci- C# академия @pythonlbooks- python книги📚 РКН: clck.ru/3Fmvsw

Показати більше

📈 Аналітичний огляд Telegram-каналу Библиотека С# С++

Канал Библиотека С# С++ (@cpluscsharp) є активним учасником. На даний момент спільнота об'єднує 10 066 підписників, посідаючи 11 687 місце в категорії Технології та додатки та 62 890 місце у регіоні Росія.

📊 Показники аудиторії та динаміка

З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 10 066 підписників.

За останніми даними від 14 вересня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -2, а за останні 24 години на 1, загальне охоплення залишається високим.

  • Статус верифікації: Не верифікований
  • Рівень залученості (ER): Середній показник залученості аудиторії становить 9.77%. Протягом перших 24 годин після публікації контент зазвичай збирає 3.78% реакцій від загальної кількості підписників.
  • Охоплення публікацій: В середньому кожен допис отримує 984 переглядів. Протягом першої доби публікація в середньому набирає 381 переглядів.
  • Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 6.
  • Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як c++, rust, github, .net, asp.net.

📝 Опис та контентна політика

Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
https://t.me/+WgGTjeH0p1NjMDFi - ссылка на канал По всем вопросам- @workakkk @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci- C# академия @pythonlbooks- python книги📚 РКН: clck.ru/3Fmvsw

Завдяки високій частоті оновлень (останні дані отримано 15 вересня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.

10 066
Підписники
+124 години
-117 днів
-230 днів

Триває завантаження даних...

Залучення підписників
вересень '26
вересень '26
+45
в 0 каналах
серпень '26
+46
в 0 каналах
Get PRO
липень '26
+39
в 0 каналах
Get PRO
червень '26
+18
в 0 каналах
Get PRO
травень '26
+25
в 0 каналах
Get PRO
квітень '26
+21
в 0 каналах
Get PRO
березень '26
+31
в 0 каналах
Get PRO
лютий '26
+134
в 0 каналах
Get PRO
січень '26
+280
в 1 каналах
Get PRO
грудень '25
+45
в 0 каналах
Get PRO
листопад '25
+159
в 2 каналах
Get PRO
жовтень '25
+53
в 0 каналах
Get PRO
вересень '25
+119
в 1 каналах
Get PRO
серпень '25
+140
в 1 каналах
Get PRO
липень '25
+172
в 0 каналах
Get PRO
червень '25
+165
в 0 каналах
Get PRO
травень '25
+46
в 0 каналах
Get PRO
квітень '25
+91
в 1 каналах
Get PRO
березень '25
+38
в 1 каналах
Get PRO
лютий '25
+109
в 0 каналах
Get PRO
січень '25
+133
в 0 каналах
Get PRO
грудень '24
+414
в 0 каналах
Get PRO
листопад '24
+1 175
в 0 каналах
Get PRO
жовтень '24
+1 196
в 0 каналах
Get PRO
вересень '24
+627
в 2 каналах
Get PRO
серпень '24
+575
в 1 каналах
Get PRO
липень '24
+484
в 1 каналах
Get PRO
червень '24
+730
в 1 каналах
Get PRO
травень '24
+469
в 35 каналах
Get PRO
квітень '24
+501
в 44 каналах
Get PRO
березень '24
+446
в 20 каналах
Get PRO
лютий '24
+435
в 1 каналах
Get PRO
січень '24
+735
в 43 каналах
Get PRO
грудень '23
+720
в 38 каналах
Get PRO
листопад '23
+231
в 1 каналах
Get PRO
жовтень '23
+459
в 18 каналах
Get PRO
вересень '23
+387
в 0 каналах
Get PRO
серпень '23
+648
в 0 каналах
Get PRO
липень '23
+506
в 0 каналах
Get PRO
червень '23
+291
в 0 каналах
Get PRO
травень '23
+1 094
в 0 каналах
Get PRO
квітень '23
+698
в 0 каналах
Get PRO
березень '23
+73
в 0 каналах
Get PRO
лютий '23
+23
в 0 каналах
Get PRO
січень '23
+60
в 0 каналах
Get PRO
грудень '22
+87
в 0 каналах
Get PRO
листопад '22
+457
в 0 каналах
Дата
Залучення підписників
Згадування
Канали
15 вересня0
14 вересня+5
13 вересня+1
12 вересня0
11 вересня+1
10 вересня+1
09 вересня0
08 вересня0
07 вересня0
06 вересня+5
05 вересня0
04 вересня+3
03 вересня+3
02 вересня+10
01 вересня+16
Дописи каналу
🔍Тестовое собеседование с Senior C# разработчиком уже завтра 15 сентября(уже завтра!) в 19:00 по мск приходи онлайн на откры
🔍Тестовое собеседование с Senior C# разработчиком уже завтра 15 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle C# разработчика. Как это будет: 📂 Александр Моргунов, старший C# разработчик с опытом 7+ лет в Европейских высоконагруженных сервисах, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Александр будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Александру Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_csharp_bot Реклама. О рекламодателе.

2
💡 C++: std::map не обязан создавать временный std::string при каждом поиске Если ключ уже приходит как std
💡 C++: std::map<std::string, ...> не обязан создавать временный std::string при каждом поиске Если ключ уже приходит как std::string_view, можно использовать transparent comparator: std::map<std::string, int, std::less<>> status_codes{ {"not_found", 404}, {"timeout", 504} }; std::string_view key = "timeout"; auto match = status_codes.find(key);
433
3
🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть курсы, читать документацию и всё р
🔥 Хочешь расти в 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_ci 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 Подпишись и сохрани, здесь регулярно появляются новые подборки, инструменты и материалы, которые реально помогают расти быстрее.
338
4
🖥 C++: объект уничтожен, а 16 МиБ всё ещё заняты std::weak_ptr может удерживать память даже при expired() == true. Причина в
🖥 C++: объект уничтожен, а 16 МиБ всё ещё заняты std::weak_ptr может удерживать память даже при expired() == true. Причина в std::make_shared: обычно он размещает объект и управляющий блок в одной аллокации. В примере на скриншоте массив на 16 МиБ находится прямо внутри Blob. После удаления последнего shared_ptr: * деструктор объекта вызывается; * expired() возвращает true; * общий блок памяти остаётся выделенным, пока существует хотя бы один weak_ptr. После сброса последней слабой ссылки блок можно освободить. Что делать: удалять протухшие ссылки из долгоживущих кешей. Для крупных объектов также можно рассмотреть отдельную аллокацию через std::shared_ptr<Blob>(new Blob()). Нюанс касается размера самого объекта. Если данные хранятся в обычном std::vector, его отдельный буфер освобождается при вызове деструктора. [Разбор от Microsoft](https://devblogs.microsoft.com/oldnewthing/20230815-00/?p=108602)
693
5
C++26 получил новый контейнер `std::hive` - что-то между `std::vector` и `std::list`. Главная фишка: элементы после вставки практически не двигаются в памяти. Поэтому указатели и итераторы на существующие объекты остаются валидными даже после вставок и удаления других элементов. Как это работает: - данные хранятся не в одном массиве, а в нескольких блоках - удалённые элементы не сдвигают остальные - свободные места потом переиспользуются - специальный skipfield позволяет быстро пропускать удалённые слоты В результате: - вставка и удаление - амортизированно O(1) - указатели остаются стабильными - локальность памяти заметно лучше, чем у std::list - но случайного доступа через [] нет - порядок вставки не гарантируется - Особенно полезно для игровых движков, пулов соединений, систем частиц и других случаев, где объекты постоянно создаются и удаляются, а другие части программы хранят указатели на них. Коротко: std::hive - не более быстрый vector, а скорее гораздо более cache-friendly альтернатива list. https://sandordargo.com/blog/2026/09/02/cpp26-hive
1 005
6
Бесплатная книга, после которой компиляторы перестают казаться магией По ходу книги вы собираете собственный компилятор с нул
Бесплатная книга, после которой компиляторы перестают казаться магией По ходу книги вы собираете собственный компилятор с нуля: от исходного кода до ARM-ассемблера. В качестве языка используется небольшой поднабор TypeScript, поэтому примеры читаются почти как псевдокод. Разбираются AST, parser combinators, парсинг, генерация кода, типизация, вывод типов, heap allocation и даже garbage collection. Есть исходники компилятора, а также порты на Python и OCaml. Читать бесплатно: https://keleshev.com/compiling-to-assembly-from-scratch/
1 298
7
🔥 Хочешь быстрее расти в 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 Физика: https://t.me/+S4hinvO3QI43ZjNi 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 037
8
🧠 Алгоритм, который превращает выражение в форму, где приоритеты операторов больше не нужны Алгоритм сортировочной станции Д
🧠 Алгоритм, который превращает выражение в форму, где приоритеты операторов больше не нужны Алгоритм сортировочной станции Дейкстры получил название в честь железнодорожной сортировочной станции - и работает очень похоже. Он преобразует обычную инфиксную запись: 3 + 4 * 2 в постфиксную: 3 4 2 * + После этого калькулятору уже не нужно каждый раз разбираться с приоритетами операторов и строить полноценное AST. Как работает идея: - один стек хранит операторы; - второй поток формирует результат; - операторы с более высоким приоритетом выходят раньше; - скобки и ассоциативность обрабатываются по правилам стека. В итоге выражение можно вычислять последовательно и без рекурсивного спуска. Простой, старый и до сих пор очень красивый алгоритм для парсеров, калькуляторов и компиляторов. #Algorithms #C #Programming #Compilers #ComputerScience
1 048
9
Четыре строки делают сложение `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 году. Небольшое усложнение цикла может заметно уменьшить ошибку без перехода на более тяжёлый числовой тип.
1 079
10
## C++ enum class: безопасно, но местами раздражает enum class даёт строгую типизацию и не позволяет случайно смешивать значе
## C++ enum class: безопасно, но местами раздражает enum class даёт строгую типизацию и не позволяет случайно смешивать значения с обычными числами. Но есть нюанс: даже если enum используется как набор флагов, Flags::Read | Flags::Write не скомпилируется. Для |, &, ^, ~ придётся вручную определить операторы и приводить значения к базовому типу. Это правильное поведение с точки зрения type safety, но бойлерплейта становится заметно больше. Поэтому в некоторых C++-проектах для битовых флагов до сих пор используют обычный enum внутри namespace: меньше защиты, зато код значительно проще.
1 151
11
Bare Metal C++: как писать прошивки на C++ без ОС и тяжёлого runtime Practical Guide to Bare Metal C++ - бесплатная практичес
Bare Metal C++: как писать прошивки на C++ без ОС и тяжёлого runtime Practical Guide to Bare Metal C++ - бесплатная практическая книга для разработчиков, которые хотят использовать C++ напрямую на микроконтроллерах и ARM-платформах. Внутри: - анализ машинного кода, который генерирует компилятор - запуск C++ без стандартного runtime - работа без исключений, RTTI и динамической памяти - шаблоны и статические структуры данных - event loop и компонентная архитектура драйверов - прерывания, таймеры, UART, GPIO, I2C и SPI - сборка bare-metal приложений для Raspberry Pi Автор показывает, как применять возможности C++ там, где ограничены память, процессорное время и размер прошивки. Это не учебник для новичков. Материал рассчитан на разработчиков, которые уже знают C++ и хотят понять, во что превращается их код на уровне железа. https://arobenko.github.io/bare_metal_cpp/ #cpp #cplusplus #embedded #baremetal
1 223
12
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку В IT прокачивается тот, кто каждый день видит сильные идеи, новые инс
🔥 Хочешь быстрее расти в 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: t.me/DevopsDocker Golang: t.me/Golang_google Rust: t.me/rust_code C++: t.me/cpluspluc C#: t.me/csharp_1001_notes Java: t.me/java_library 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 курсов: @courses ИТ-книги бесплатно: 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 Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд. Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.
864
13
🗺️ Полный роадмап C++ 2026 — от нуля до профессионала Это не просто список тем, а пошаговый маршрут превращения новичка в пр
🗺️ Полный роадмап C++ 2026 — от нуля до профессионала Это не просто список тем, а пошаговый маршрут превращения новичка в профессионального C++-разработчика. Каждый уровень даёт не только перечень концепций, но и рабочие примеры кода с пояснениями «как правильно» и «как неправильно», чтобы вы сразу видели идиоматичный современный C++, а не устаревшие практики из учебников 2000-х годов. Роадмап построен по принципу «теория рядом с практикой»: сначала вы изучаете концепцию на коде из соответствующего уровня, а затем углубляете понимание в разделе. 📚 Теория C++, где каждая тема разобрана от базовой интуиции до тонкостей, важных на собеседованиях и в продакшене. Такой подход экономит месяцы: вы не зубрите оторванные факты, а понимаете, почему язык устроен именно так. Как пользоваться: идите по уровням сверху вниз, не перепрыгивая. Пишите каждый пример руками, ломайте его, смотрите на ошибки компилятора — именно так формируется интуиция. Параллельно решайте задачи на платформах из раздела ресурсов и читайте теорию по мере появления вопросов. https://github.com/justxor/cpproadmap2026/tree/main
1 105
14
Красота C в том, что он почти не прячет механику компьютера. Хочешь понять, как копируется файл? Не нужен огромный фреймворк.
Красота C в том, что он почти не прячет механику компьютера. Хочешь понять, как копируется файл? Не нужен огромный фреймворк. Достаточно посмотреть на простой C-код: • открыть исходный файл через fopen • открыть файл назначения • выделить буфер через malloc • читать кусками через fread • записывать через fwrite • освободить память и закрыть файлы Всё честно и прямо: байты читаются из одного места и записываются в другое. Именно поэтому C до сих пор так важен. Он не всегда самый удобный, но он показывает, что реально происходит под капотом. После такого начинаешь лучше понимать не только язык, а саму систему.
919
15
Аллокации, которых нет в коде: охота на скрытый боксинг в .NET 10 Самая дорогая аллокация в вашем сервисе та, которой нет в и
Аллокации, которых нет в коде: охота на скрытый боксинг в .NET 10 Самая дорогая аллокация в вашем сервисе та, которой нет в исходниках. Вы написали struct ради zero-allocation, прошли code review, а в проде Gen0-коллекции все равно идут косяком. Потому что между вашим кодом и машинным кодом стоит компилятор, и он молча упаковывает ваш value-тип в кучу там, где вы этого не просили — а на код-ревью этого не видно. TL;DR. Боксинг (boxing) в .NET - это не только object o = 42. Он прячется в вызовах интерфейсных методов на struct, в дефолтном ValueType.Equals, в params object[]-аргументах, в foreach по интерфейсу и в замыканиях. При этом часть “классических” примеров боксинга из старых гайдов на современном рантайме уже не аллоцирует — JIT научился их вырезать, и слепо копировать советы десятилетней давности вредно. Ниже — карта мест, где боксинг живёт и сейчас, отдельный разбор того, что рантайм уже оптимизировал, реальный мини-кейс, воспроизводимый бенчмарк на BenchmarkDotNet с MemoryDiagnoser, способ ловить упаковку через DOTNET_JitDisasm и dotnet-gcdump, и паттерны лечения без потери читаемости. О версиях и числах. Всё прверялось на .NET 10 (текущий LTS) и C# 13/14-уровне компилятора, Release, без отладчика, BenchmarkDotNet с MemoryDiagnoser. На .NET 8/9 поведение в основном такое же, но отдельные оптимизации JIT отличаются между мажорными версиями — поэтому главный принцип статьи: не верьте на слово (в том числе мне), гоняйте MemoryDiagnoser на своей версии рантайма. Числа в таблицах ниже - иллюстративные, порядок величины, а не точные замеры с вашего железа. Пролог: “у нас же всё на struct, откуда Gen0?” Сервис на горячем пути считает метрики: миллионы маленьких readonly struct-значений в секунду, никакого new, никаких классов в hot path. По задумке — ноль аллокаций. На дашборде — стабильный поток Gen0-коллекций раз в несколько секунд под нагрузкой. Профайлер показывает аллокации, но стек ведёт в метод, где в коде нет ни одного new. Там цикл по интерфейсу, пара вызовов .Equals(), передача значения в params-метод лога. Глазами — чисто. В машинном коде — box-инструкции на каждой итерации. Это и есть скрытый боксинг: компилятор C# и JIT упаковывают ваш struct в объект на куче, потому что в конкретной точке кода value-тип нужно представить как ссылочный. Симптом — Gen0-коллекции “из ниоткуда”, и его не видно ни в code review, ни в дампе, пока не посмотришь на IL или дизасм. Если тема близка - я регулярно разбираю такие штуки по C# и .NET (внутренности рантайма, перформанс, неочевидные грабли с замерами и дизасмом) в своём Telegram-канале: t.me/csharp_ci. Заходите, если интересно копаться глубже. Что такое боксинг и почему он стоит дорого Боксинг — это упаковка value-типа (struct, enum, примитив) в объект на управляемой куче. Рантайму нужно выделить заголовок объекта, скопировать туда значение и вернуть ссылку. Анбоксинг - обратная операция с проверкой типа. Цена не в самой инструкции, а в последствиях: каждая упаковка - это аллокация в Gen0. Много мелких аллокаций на горячем пути означают частые Gen0-коллекции, паузы (пусть и короткие), вытеснение полезных данных из кэша и общий рост CPU на ровном месте. На сервисе с SLA по p99 это бьёт по хвосту латентности так же, как и любая другая лишняя аллокация. В IL боксинг виден явно - инструкция box. Именно её мы и будем искать. Читать дальше: https://habr.com/ru/articles/1049236/
796
16
⚡️ 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 такой компактный: никаких явных рёбер, указателей и рекурсии. Только массив и битовая арифметика. Красота структуры в том, что дерево как бы спрятано внутри двоичного представления индекса.
842
17
C++23 добавил `std::expected`, и это одна из самых практичных вещей в языке за последние годы. Идея простая: функция возвраща
C++23 добавил `std::expected`, и это одна из самых практичных вещей в языке за последние годы. Идея простая: функция возвращает либо нормальный результат, либо ошибку. Без исключений, без output-параметров и без неявного control flow, который потом сложно отследить. Например, парсер заголовка может вернуть uint32_t, если всё хорошо, или std::error_code, если буфер слишком короткий. Вызывающая сторона сразу видит: здесь результат может быть ошибкой, её нельзя «случайно забыть» так же легко, как при старом стиле с кодами возврата. Это особенно удобно для системного кода, сетевых протоколов, парсеров, embedded и всего, где исключения либо запрещены, либо нежелательны. std::expected не делает обработку ошибок магической. Он просто заставляет контракт функции быть честным: успешный результат и возможная ошибка описаны прямо в типе.
978
18
CUDA 13.3 - это не просто очередной апдейт тулкита NVIDIA, а шаг к более высокоуровневому GPU-программированию. Главное измен
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
1 010
19
Ищем Senior Rendering Engineer (C++) в команду 3D-карты 2ГИС Мы делаем карту более реалистичной: работаем над рельефом, дорог
Ищем Senior Rendering Engineer (C++) в команду 3D-карты 2ГИС Мы делаем карту более реалистичной: работаем над рельефом, дорогами, развязками, тоннелями, анимациями и графическими эффектами. Внутри — собственный 3D-движок на C+20 (500k строк кода), современные графические API (Vulkan, Metal, OpenGL), шейдеры, сложные алгоритмы и задачи производительности. Будет интересно, если вам нравится компьютерная графика, низкоуровневая разработка и создание продукта, который ежедневно используют миллионы людей. Удалённо из РФ или из офисов 2ГИС. ДМС, обучение, конференции и возможность напрямую влиять на развитие 3D-карты. Подробнее Другие инженерные инсайты от 2ГИС → в Telegram-канале RnD
439
20
⚡️ Бинарный поиск, который вы выучили, скорее всего, был неправильным. Джон Бентли опубликовал реализацию бинарного поиска в
⚡️ Бинарный поиск, который вы выучили, скорее всего, был неправильным. Джон Бентли опубликовал реализацию бинарного поиска в *Programming Pearls* после того, как доказал её корректность и протестировал. Баг прожил почти 20 лет. Позже Джошуа Блох нашёл точно такую же ошибку в реализации бинарного поиска, которую сам написал для JDK. Исследование 1988 года показало: корректный бинарный поиск был только в 5 из 20 учебников. Ошибка проявляется только на массивах размером 2^30 элементов и больше. Проблема возникает при вычислении середины: mid = (low + high) / 2; На очень больших массивах low + high может вызвать переполнение. Правильнее писать так: mid = low + (high - low) / 2; В C такое переполнение может привести к выходу за границы массива и непредсказуемому поведению. В Java это обычно заканчивается ArrayIndexOutOfBoundsException. Та же ошибка затрагивала mergesort и огромное количество других алгоритмов «разделяй и властвуй».
1 011