Обновить
283.14

C++ *

Типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Оптимизация: типичные ошибки программистов и как их можно исправить

Время на прочтение18 мин
Охват и читатели7.2K

Привет, Хабр. Меня зовут Павел Преблагин, я работаю в команде инжиниринга производительности Positive Technologies. Мы анализируем разные продукты компании и пытаемся так или иначе оптимизировать их изнутри. Как уже можно понять, команда наша мультипроектная: у нас нет постоянной кодовой базы, кроме некоторых инструментов анализа и тестирования. Обычно коллеги из других отделов приносят нам для изучения свою, написанную преимущественно на C++, если у них есть подозрения, что что-то работает не так быстро, как должно было бы. Мы в ответ приносим им результаты замеров, патчи и рекомендации.

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

Разобраться

Как сторонние библиотеки меняют правила анализа кода

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели1.3K

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

Читать далее

Spears & bits

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели2.2K

В играх часто используется паттерн упаковки булевых значений в биты. Это удобно для оптимизации памяти и ускорения выполнения массовых проверок. Например, такие проверки могут включать нахождение игрока в тайле, определение доступности клеток на четырех- или шестигранной сетке, или другие пространственные проверки, которые необходимо выполнять быстро. Это не ракетостроение, но когда профайлер показал одну из таких функций в числе горячих, мне стало интересно, как именно она работает и можно ли её оптимизировать. Структура данных bitset — это способ эффективно представлять множество целых индексов, которое к тому же поддерживает различные операции над ним, например объединение, разность, пересечение.

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

Для представления данных мы можем использовать индекс юнита в тайле. В качестве типовой задачи проверять будем только юнитов, у которых здоровье превышает определённое значение. Это условие не взято с потолка. Например, некоторые юниты используют стратегии вроде "убей слабейшего" или "нападай стаей". Для таких стратегий поюнитный обход всех юнитов вокруг (особенно если это выполняют все юниты в группе) может стать крайне затратной по времени операцией.

Название статьи получилось как-то само собой: недалеко от моего дома есть хорошее кафе Chief&Bites, достаточно популярное у местных жителей, но пирожные там начинают делать после заказа, такой вот формат анти-кафе. Сами понимаете, прождать пока сделают свежайшее пирожное полчаса, а то и час - легко, там даже на чеке пишут время, когда начали делать именно твое пирожное. Заранее извиняюсь за возможные "велосипеды" в коде, но, возможно, эта тема покажется кому-то полезной.

Паковай давай...

Развенчиваем популярные мифы и заблуждения о компиляторах

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели9.7K

▍ Введение


Компиляторы всегда были окружены аурой загадочности и магии. Из-за этого многие из нас верят, что они делают то, чего они не делают, или что они не делают того, что делают1.

Эта статья станет своего рода продолжением статьи о компиляторных оптимизациях. Я перечислю некоторые заблуждения, с которыми я сталкивался за долгие годы (многие из них были моими), и постараюсь развеять все мифы. Заранее скажу, что эта статья посвящена только крупным популярным компиляторам общего назначения наподобие LLVM, GCC и ICX. Некоторые из сделанных здесь утверждений не относятся, например, к специализированным компиляторам2, а также к мелким и средним компиляторам3.
Читать дальше →

Как вызвать функцию, имея только ее имя в Unreal Engine

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели1.3K

Сегодня я расскажу про такую возможно полезную для кого-то вещь, как вызов функции по её имени в Unreal Engine 5 (причем с любым возвращаемым значением и любым кол-вом переменных у данной функции). Также будет разобрано практическое применение данного алгоритма на примере создания меню графических настроек.

Читать далее

Баг в реализации SRWLock в Windows вешает многопоточные программы

Уровень сложностиСредний
Время на прочтение2 мин
Охват и читатели2K

Реализация SRWLock (Slim Reader/Writer Lock) на Windows может привести к серьёзным проблемам: многопоточное приложение может зависнуть (deadlock).

При частой конкуренции многих потоков, удерживающих shared_lock, и хотя бы одного потока, пытающегося получить unique_lock, возможно возникновение ситуации, когда потоки оказываются в состоянии взаимного ожидания. Код выглядит абсолютно корректным, но приложение зависает внутри вызова в WinAPI.

Это касается любых многопоточных программ для Windows, которые явно либо неявно используют SRWLock для синхронизации. В том числе написанных на старых реализациях Rust, пока в Rust не заменили реализацию для Windows, отказавшись от SRWLock (GitHub Issue). В том числе написанных на C# (фикса пока нет) и т.д.

Читать далее

std::chrono в C++: управляем временем

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели11K

Привет, Хабр!

Помните, какие времена были? Когда-то мы всерьез возились с time_t и ctime, огребали от структур tm и, если хотели засечь время, то приходилось чудить с difftime() и писать собственный секундомер на костылях. Вспомнить страшно — в голове сразу всплывают унылые алгоритмы перевода секунд в даты и обратно, а при упоминании часовых поясов хочется плакать. Слава небесам, пришел std::chrono! С ним управлять временем в коде можно чуть ли не с шиком: точные интервалы, аккуратные преобразования, поддержка календарей и таймзон — все это теперь под рукой и без изнуряющих плясок с бубном.

В этой статье я расскажу как использовать std::chrono.

Читать далее

Кастомная сериализация структур в UE

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели766

Допустим, вы создали свою USTRUCT в C++ и хотите её сериализовать.

Обычно, достаточно просто пометить нужные поля как SaveGame. Но вот проблема, для этого они сами должны поддерживать сериализацию. К сожалению, одна из наших переменных ее не поддерживает. В моем случае, это структура FNonSerializableStruct. Из-за этого сериализуется только вторая структура, хоть мы и пометили SaveGame обе.

Читать далее

Зачем покупать, когда можно… или как я собирал систему мониторинга фильтра воды и что из этого вышло

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели17K

Привет, Хабр!

Наверное, многие из вас понимают, насколько важно качество питьевой воды для здоровья человека. Технологии не стоят на месте и высокотехнологичные решения очистки воды, которые когда-то казались фантастикой, теперь доступны и для бытового применения за небольшие деньги. Речь идет о фильтре, работающего на принципе обратного осмоса, который позволяет получать питьевую воду высокого качества даже из самых загрязненных источников. В этой статье я расскажу о своем опыте разработки системы мониторинга для бытового фильтра воды и что в итоге из этого получилось.

Читать далее

Ultimatum — еще один форк хромиума, с претензией…

Время на прочтение10 мин
Охват и читатели5.9K

image


Добрый день! Меня зовут Тимур и я программист.


Сегодня я хочу сделать настоящий анонс своей сборки chromium — Ultimatum. Он умеет уже достаточно много что бы гордо носить свое собственное имя.


В прошлой своей статье я рассказал о том как пробросил в js прямой доступ до http кеша и объяснил для чего я это делаю. Статья завершилась со словами что я еще вернусь со своим антидетект браузером. Я вернулся и это немного больше чем антидетект браузер.


Если коротко — Ultimatum уже помножил на ноль такие техники трекинга как hsts-pinning, favicons cache и вообще использование многих других кешей в трекинге. А также! Теперь можно поставить расширение с любого сайта, не только со сторов гугля, оперы или микрософта (с них кстати тоже можно — со всех!). А еще! Можно перехватывать сетевые запросы и подменять их полностью! Ну и так далее и тому подобное.


А теперь более подробно и более спокойно.

Читать дальше →

Тривиальное перемещение и рефлексия: реализуем фичу из C++26 в библиотеке

Время на прочтение8 мин
Охват и читатели2.8K

В статье разработчик Барри Ревзин* объясняет, как можно определить и проверить свойства типов для обеспечения тривиального перемещения, разбирая нюансы эффективности, удобства и точности реализации. Основная проблема здесь в необходимости учёта всех особенностей типов, включая пользовательские функции, наследование и перегрузку. Это требует как сложных эвристик, так и новых инструментов языка. 

Под катом вы найдёте решение с аннотациями и механизмами рефлексии для создания гибкой и относительно компактной реализации. Автор показывает потенциал рефлексии в автоматизации задач, которые ранее требовали дополнительных усилий, и демонстрирует возможности для улучшения библиотек и кода на C++.

*Обращаем ваше внимание, что позиция автора может не всегда совпадать с мнением МойОфис

Читать далее

Медианы чисел

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели1.3K

Пусть дано нечётное количество чисел. Обозначим его через n = 2k + 1. Будем считать, что все числа разные. Медианой считается то число из них, для которого есть k чисел меньше его и k чисел больше. Далее будут рассматриваться алгоритмы поиска медиан при небольших значений n.

Читать далее

Игровой автомат своими руками

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели3.8K

Создание игрового автомата с нуля своими руками!

Как сделать игровой автомат на ESP32 для обучения детей. За победу в игре выдает призы!

Читать далее

Ближайшие события

Контрибьютор C++ забанен за использование слова «question» в названии своей статьи

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели51K

C++ ISO Standards Group, организация, отвечающая за стандартизацию языка C++, так же известная как WG21, исключила из своих рядов longtime-контрибьютора после того, как тот использовал простое слово "question" (рус. - "вопрос") в названии одной из своих работ.

И да, это безумно ровно настолько же, насколько звучит.

Читать далее

Синтаксис, синглтон и смертельный ромб в С++: взгляд опытного разработчика на C

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели6.1K

Давайте знакомиться: меня зовут Анатолий Семятнёв, я и моя команда разрабатываем ПО для опорных сетей 5G в YADRO. В IT-сфере работаю давно, и мой опыт в основном связан с языком С: занимался Board Support Package (BSP) и драйверами, много работал с операционной системой QNX. 

До того, как начал полноценно работать на С++, сталкивался с языком в нулевые, писал на С++98. Тем не менее все это время я краем глаза поглядывал, что происходит в С++, и хотел вернуться к программированию на этом языке. Читал книги, делал пет-проекты, смотрел записи конференций и митапов по С++. А когда пришел в YADRO, стал писать на С++.

Мне с ходу дали большую фичу для имплементации, я писал много кода, и получал комментарии от коллег. В этом материале собрал все, что изучил или вспомнил по итогам код-ревью. Что рассмотрим в статье:

• Ключевые концепции — explicit, final, default, string — и как их использовать.

• Инициализацию мемберов с помощью пустого брейс-листа.

• Синглтон Майерса в корутинах.

• «Смертельный ромб» и все, что связано с виртуальным наследованием.

Читать далее

Отладка вашего «процессора» вместе с Андерсом Шау Кнаттеном, автором книги «C++ Brain Teasers: Exercise Your Mind»

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели1.9K

Дорогие читатели, команда PVS-Studio представляет вашему вниманию интервью с Андерсом Шау Кнаттеном, автором книги "C++ Brain Teasers: Exercise Your Mind". В этой статье вы познакомитесь с его новой книгой по C++, откроете для себя увлекательные способы изучения стандартов языка и рассмотрите некоторые распространённые ошибки, которые допускают C++ разработчики, а также узнаете немного о биографии Андерса. Надеемся, вам понравится!

Читать далее

Два лагеря C++

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели14K

Сейчас ведётся много споров и дискуссий о будущем C++.

Не только на Reddit и одном оранжевом веб-сайте, но и совершенно точно на официальных заседаниях комитета по стандарту C++.

Абсолютное состояние (языка C++)

Похоже, мы находимся в следующей ситуации:

Evolution Working Group (EWG) языка C++ как раз достигла консенсуса по внедрению P3466 R0 - (Re)affirm design principles for future C++ evolution:

Это означает отсутствие поломок ABI, сохранение совместимости компоновки с кодом на C и предыдущими версиями C++.

Также это означает отсутствие «виральных аннотаций» (например, аннотаций времени жизни).

Удвоение усилий по множеству несовместимых задач, например, отсутствия поломок ABI и принципа zero overhead.

Плохо это или хорошо, но это (в буквальном смысле) удвоение усилий по развитию текущей траектории языка C++.

Читать далее

Быстрый однопоточный std::shared_ptr в GCC

Уровень сложностиПростой
Время на прочтение1 мин
Охват и читатели1.8K

Все знают что std::shared_ptr/weak_ptr тормозят, но это не повод от них отказываться и писать свой велосипед или небезопасный код на сырых указателях, ведь ситуацию можно исправить выключив синхронизацию потоков. Код который я вам покажу, работает в GCC и позволяет сконструировать новый shared_ptr без атомарных синхронизаций. Если у вас однопоточное приложение, вы можете подставить этот новый шаред поинтер за место старого для ускорения программы.

Ну чё там за код, показывай

TrapC: безопасный «наследник» C и C++. Что за язык?

Время на прочтение5 мин
Охват и читатели7.1K

Стартап Trasec разрабатывает новый язык программирования, который называется TrapC. Авторы проекта провозглашают его «наследником» C и C++. ЯП обещает устранить главные проблемы «предков», включая небезопасное управление памятью. Для этого в TrapC внедрены автоматические проверки и защита программ от типичных ошибок. Это делает невозможным выход за границы буфера или обращение к несуществующей памяти и значительно усложняет жизнь хакерам. Давайте оценим новинку.

Читать далее

Как работают std::launder и std::as_const в C++

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели2.1K

Есть в C++ такие штуки, которые вроде как существуют в стандарте, но некоторые о них даже не задумываются, пока не наткнутся на что‑то совсем странное. Вот, например,std::launder. Что это вообще? Стирка чего‑то грязного в коде (launder)? Или std::as_const — зачем делать объект «немного более константным»?

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

Читать далее

Вклад авторов