В начале 2018 года в нашем блоге появился цикл статей, посвящённый шестой проверке исходного кода проекта Chromium. Цикл включает в себя 8 статей, посвященных ошибкам и рекомендациям по их предотвращению. Две статьи вызвали бурное обсуждение, и до сих пор на почту мне изредка приходят комментарии касательно тем, затронутых в них. Пожалуй, следует дать некоторые дополнительные пояснения и, как говорится, расставить точки над i.
Читать полностью »
Рубрика «c++» - 70
Шестая проверка Chromium, послесловие
2019-02-04 в 8:08, admin, рубрики: C, c/c++, c++, chromium, code review, Google Chrome, malloc, memset, null, open source, pvs-studio, static code analysis, undefined behavior, Блог компании PVS-Studio, обработка ошибок, Си, статический анализ кода, статический анализатор кодаТри картинки за одно воскресенье: о создании бюджетных стереоизображений на пальцах (стереограмма, анаглиф, стереоскоп)
2019-02-03 в 20:48, admin, рубрики: c++, CGI (графика), raytracing, геометрия для пятого класса, компьютерная графика, математика на пальцах, Программирование, Работа с 3D-графикой, разработка игр, стереограммы, трассировка лучейПришли очередные выходные, надо написать пару десятков строк кода и нарисовать картинку, да лучше не одну. Итак, на прошлых и позапрошлых выходных я показал, как делать трассировку лучей и даже взрывать всякое. Это многих удивляет, но комьпютерная графика — очень простая вещь, пары сотен строк голого C++ вполне хватает на создание интересных картинок.
Тема сегдоняшнего разговора — бинокулярное зрение, причём сегодня даже до ста строк кода не дотянем. Умея рендерить трёхмерные сцены было бы глупо пройти мимо стерепар, сегодня будем рисовать примерно вот такое:
Инициализация в С++ действительно безумна. Лучше начинать с Си
2019-02-01 в 14:51, admin, рубрики: braced-init-list, C, c++, copy-list-initialization, агрегированный тип, инициализация, конструктор, обучение программированию, разрешение перегрузкиНедавно мне напомнили, почему я считаю плохой идеей давать новичкам C++. Это плохая идея, потому что в C++ реальный бардак — хотя и красивый, но извращённый, трагический и удивительный бардак. Несмотря на нынешнее состояние сообщества, эта статья не направлена против современного C++. Скорее она частично продолжает статью Саймона Брэнда «Инициализация в C++ безумна», а частично — это послание каждому студенту, который хочет начать своё образование, глядя в бездну.
Типичные возражения студентов, когда им говорят об изучении C:
- «Кто-то его ещё использует?»
- «Это глупо»
- «Почему мы изучаем C?»
- «Мы должны учить что-то лучшее, например, C++» (смех в зале)
OpenSceneGraph: Уровни детализации (LOD) и фоновая загрузка объектов
2019-02-01 в 11:27, admin, рубрики: c++, CGI (графика), openscenegraph, графический движок, Программирование, Работа с 3D-графикой, Разработка под Linux, разработка под windows
Введение
Одной из интереснейших задач, решаемых посредством трехмерной графики является создание «больших миров» — протяженных сцен, содержащих большое число объектов с возможностью неограниченного перемещения по сцене. Решение этой задачи упирается в понятные ограничения, присущие аппаратному обеспечению компьютера.
Типичный пример: «большой мир» при визуализации железной дороги на движке OSG. Не хватает только лангольеров, пожирающих мир за поездом...
В этой связи возникает необходимость управления ресурсами приложения, сводящаяся к очевидному решению: загрузке только тех ресурсов (моделей, текстур и так далее), которые необходимы для формирования сцены в текущий момент времени при текущем положении наблюдателя; уменьшении уровней детализации удаленных объектов; выгрузке не нужных более объектов из памяти системы. В большинстве своем графические и игровые движки предоставляют некоторый набор инструментов для решения подобных задач. Сегодня мы рассмотрим, какие из них имеются в OpenSceneGraph.
Читать полностью »
Как я Keras на C++ запускал
2019-01-31 в 20:42, admin, рубрики: c++, keras, mashine learning, neural networks, python, искусственный интеллект, машинное обучениеНе так давно передо мной встала производственная задача – запустить обученную модель нейронной сети Kesas
на нативном C++
коде. Как ни странно, решение оказалось вообще не тривиальным. В результате чего появилась собственная библиотека, дающая такую возможность. О том, как же это – нейросети на чистых крестах и будет сегодняшняя небольшая статья.
Тем, кому не терпится – вот тут репозитарий на github, с подробным описанием использования. Ну а всех остальных прошу под кат… Читать полностью »
«Современный» C++: сеанс плача с причитаниями
2019-01-31 в 9:21, admin, рубрики: c++, C++ Russia, c++ russia 2019, ranges, Алгоритмы, Блог компании JUG.ru Group, высокая производительность, разработка игрЗдесь будет длиннющая стена текста, с типа случайными мыслями. Основные идеи:
- В C++ очень важно время компиляции,
- Производительность сборки без оптимизаций тоже важна,
- Когнитивная нагрузка ещё важней. Вот по этому пункту особо распространяться не буду, но если язык программирования заставляет меня чувствовать себя тупым, вряд ли я его буду использовать или тем более — любить. C++ делает это со мной постоянно.
Блогпост «Standard Ranges» Эрика Ниблера, посвященный ренжам в C++20, недавно облетел всю твиттерную вселенную, сопровождаясь кучей не очень лестных комментариев (это ещё мягко сказано!) о состоянии современного C++.
Даже я внёс свою лепту (ссылка):
Этот пример пифагоровых троек на ренжах C++20, по моему, выглядит чудовищно. И да, я понимаю, что ренжи могут быть полезны, проекции могут быть полезны и так далее. Тем не менее, пример жуткий. Зачем кому-то может понадобиться такое?
Давайте подробно разберём всё это под катом.Читать полностью »
Помещаем строки в параметры шаблонов
2019-01-30 в 20:19, admin, рубрики: c++, C++14, constexpr, stringsСовременный C++ принес нам кучу возможностей, которых раньше в языке остро не хватало. Чтобы хоть как-то получить подобный эффект на протяжении долгого времени изобретались потрясающие костыли, в основном состоящие из очень больших портянок шаблонов и макросов (зачастую еще и автогенеренных). Но и сейчас время от времени возникает потребность в возможностях, которых все еще нет в языке. И мы начинаем снова изобретать сложные конструкции из шаблонов и макросов, генерировать их и достигать нужного нам поведения. Это как раз такая история.
За последние пол-года мне дважды понадобились значения, которые можно было бы использовать в параметрах шаблона. При этом хотелось иметь человеко-читаемые имена для этих значений и исключить необходимость в объявлении этих имен заранее. Конкретные задачи, которые я решал — отдельный вопрос, возможно позже я еще напишу про них отдельные посты, где-нибудь в хабе «ненормальное программирование». Сейчас же я расскажу о подходе, которым я решал эту задачу.
Читать полностью »
«Современные» обедающие философы на C++ посредством акторов и CSP
2019-01-30 в 12:56, admin, рубрики: actor model, actors, c++, C++14, concurrency, multithreading, open source, sobjectizer, ПрограммированиеНекоторое время назад ссылка на статью "Modern dining philosophers" распространилась по ресурсам вроде Reddit и HackerNews. Статья интересная, она показывает несколько решений этой известной задачи, реализованных на современном C++ с использованием task-based подхода. Если кто-то это статью еще не читал, то имеет смысл потратить время и прочесть ее.
Однако, не могу сказать, что представленные в статье решения мне показались простыми и понятными. Вероятно это как раз из-за использования тасков. Слишком уж их много создается и диспетчируется посредством разнообразных диспетчеров/сериализаторов. Так что не всегда понятно, где, когда и какие задачи выполняются.
При этом task-based подход не является единственным возможным для решения подобных задач. Почему бы не посмотреть, как задача "обедающих философов" решается посредством моделей Акторов и CSP?
Посему попробовал посмотреть и реализовал несколько решений этой задачи как с использованием Акторов, так и с использованием CSP. Код этих решений можно найти в репозитории на BitBucket-е. А под катом пояснения и объяснения, так что кому интересно, милости прошу под кат.
Форматирование исходного кода в Linux средствами ClangFormat: проблемы и решение
2019-01-28 в 11:27, admin, рубрики: C, c++, clang-format, Git, java, javascript, linux, objective-c, protobuf, Программирование, Производство и разработка электроники, Разработка под Linux, Совершенный код
Согласитесь, приятно и полезно, когда в проекте исходный код выглядит красиво и единообразно. Это облегчает его понимание и поддержку. Покажем и расскажем, как реализовать форматирование исходного кода при помощи clang-format, git и sh.
Читать полностью »