Как стать автором
Обновить
254.08

C++ *

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

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

Руководство Google по стилю в C++. Часть 2

Время на прочтение7 мин
Количество просмотров39K
Часть 1. Вступление
Часть 2. Заголовочные файлы
Часть 3. Область видимости



Все мы при написании кода пользуемся правилами оформления кода. Иногда изобретаются свои правила, в других случаях используются готовые стайлгайды. Хотя все C++ программисты читают на английском легче, чем на родном, приятнее иметь руководство на последнем.
Эта статья является переводом части руководства Google по стилю в C++ на русский язык.
Исходная статья (fork на github), обновляемый перевод.
Читать дальше →

4 угла хорошо, а 6 лучше: гексагональные шахматы в консоли и с ботом

Время на прочтение11 мин
Количество просмотров6.9K
Привет!

Мы учимся на первом курсе бакалавриата «Прикладная математика и информатика» в Питерской Вышке. Во время работы над семестровым командным проектом по С++ мы решили написать компьютерную версию Интеллектора с ботом — шахматную игру на гексагональной доске с особыми фигурами.

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


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

Изобретаем велосипед или пишем персептрон на С++. Часть 3

Время на прочтение5 мин
Количество просмотров5.9K

Изобретаем велосипед или пишем персептрон на C++. Часть 3


Реализуем обучение многослойного персептрона на C++ при помощи метода обратного распространения ошибки.



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

Пишем автодополнение для ваших CLI проектов

Время на прочтение15 мин
Количество просмотров6.8K

Приветствие


Всем привет! Хочу поделиться своим опытом написания кроссплатформенного проекта на C++ для интеграции автодополнения в CLI приложения, усаживайтесь поудобнее.



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

Статический анализ кода коллекции библиотек PMDK от Intel и ошибки, которые не ошибки

Время на прочтение14 мин
Количество просмотров2.2K
PVS-Studio, PMDK

Нам предложили проверить с помощью анализатора PVS-Studio коллекцию открытых библиотек PMDK, предназначенную для разработки и отладки приложений с поддержкой энергонезависимой памяти. Собственно, почему бы и нет. Тем более это небольшой проект на языке C и C++ с общим размером кодовой базы около 170 KLOC, если не считать комментарии. А значит, обзор результатов анализа не займёт много сил и времени. Let's go.
Читать дальше →

Немного об ускорении программы: распараллеливание (ручное или автоматическое) на базе сверхоптимистичных вычислений

Время на прочтение8 мин
Количество просмотров6.8K
Здравствуйте, уважаемые читатели. В этой публикации речь пойдет о такой (уже ставшей привычной) вещи как ускорение работы программы путем применения параллельных вычислений. Технологии организации таких вычислений известны – это и обычное многопоточное программирование, и применение специальных интерфейсов: OpenMP, OpenAcc, MPI, DVM и многих других (при этом распараллеливаются циклы, используется векторизация или конвейеризация, организуются ленивые вычисления, выделяются независимые блоки программы, которые можно запустить в параллель и т.п.).

При этом обычно исходят из той идеи, что распараллеливание не должно каким-то образом влиять на результаты исполнения программы. Это жесткое, но справедливое для многих случаев требование. Однако если мы пытаемся распараллелить программу, ведущую какие-либо расчеты численными методами (обучаем нейронную сеть, моделируем динамику жидкости или молекулярной системы, решаем обыкновенные дифференциальные уравнения или оптимизационные задачи), то результат и так (в любом случае) будет иметь некоторую погрешность. Поэтому, почему бы не применить «рискованные» технологии распараллеливания, которые могут внести в математическое решение небольшую дополнительную погрешность, но позволят получить еще некоторое дополнительное ускорение? Об одной из таких технологий – о расщеплении тел циклов с предсказанием промежуточных результатов и откатом при неудачном предсказании (собственно, это и есть «сверхоптимистичные» вычисления в частично транзакционной памяти) и пойдет речь.
Читать дальше →

STL, allocator, его разделяемая память и её особенности

Время на прочтение11 мин
Количество просмотров13K

Разделяемая память — самый быстрый способ обмена данными между процессами. Но в отличие от потоковых механизмов (трубы, сокеты всех мастей, файловые очереди ...), здесь у программиста полная свобода действий, в результате пишут кто во что горазд.

Так и автор однажды задался мыслью, а что если … если произойдёт вырождение адресов сегментов разделяемой памяти в разных процессах. Вообще-то именно это происходит, когда процесс с разделяемой памятью делает fork, а как насчет разных процессов? Кроме того, не во всех системах есть fork.

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

Отличный, кстати, пример. Не то, чтобы автор сильно любил STL, но это возможность продемонстрировать компактный и всем понятный тест на работоспособность предлагаемой методики. Методики, позволяющей (как видится) существенно упростить и ускорить межпроцессное взаимодействие. Вот работает ли она и чем придётся заплатить, будем разбираться далее.
Читать дальше →

Boost.Compute или параллельные вычисления на GPU/CPU. Часть 2

Время на прочтение4 мин
Количество просмотров5.4K

Вступление


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

Предыдущая часть понравилась многим, поэтому я снова перелопатил половину документации boost и нашёл о чем написать. Очень странно что вокруг boost.compute нету такого же ажиотажа как и вокруг boost.asio. Ведь достаточно, того эта библиотека кроссплатформенная, так ещё и предоставляет удобный (в рамках c++) интерфейс взаимодействия с параллельными вычислениями на GPU и CPU.

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

Boost.Compute или параллельные вычисления на GPU/CPU. Часть 1

Время на прочтение4 мин
Количество просмотров8.5K

Вступление


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

По моим меркам я уже достаточно давно пишу код на C++, но до этого времени ещё не сталкивался с задачами, связанными с параллельными вычислениями. Я не увидел ни одной статьи о библиотеке Boost.Compute, поэтому эта статья будет именно о ней.
Читать дальше →

Обучение технологии ray-casting, часть 1

Время на прочтение3 мин
Количество просмотров27K
Двумерное indie… трехмерные AAA-проекты… А может что-то промежуточное?

Приветствую всех читателей. Мною было решено обобщить и перевести замечательную серию статей «Ray-Casting Tutorial For Game Development And Other Purposes» за авторством Ф. Пермади по изучению технологии ray-casting.

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

QSerializer умер, да здравствует QSerializer

Время на прочтение7 мин
Количество просмотров3.5K
Прошло несколько месяцев с тех пор, как я здесь рассказал о своем проекте Qt-based библиотеки для сериализации данных из объектного вида в JSON/XML и обратно. Надо признать — реализация получилась, прямо скажем, спорной.

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


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

Получение исходного кода PowerPacker Cruncher от AmigaOS

Время на прочтение5 мин
Количество просмотров3.6K


Всем привет,


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


Понятно, что можно взять любой доступный алгоритм сжатия и использовать его у себя, но не существовало бы сейчас такого огромного количества различных упаковщиков, если бы всем хватало одного единственного алгоритма. Кому-то не нравится скорость работы, кому-то — качество сжатия, вот и изобретаются всё новые и новые алгоритмы. Одним из них и стал PowerPacker, исходные коды которого хотели получить многие, но удалось только мне.

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

C++ template аллокатора с потокобезопасным циклическим буфером

Время на прочтение9 мин
Количество просмотров8.8K
Вашему вниманию простой C++ template аллокатора с потокобезопасным циклическим буфером.

Вся реализация в одном заголовочном .h файле: [fast_mem_pool.h]

Фишки, чем этот аллокатор лучше сотни подобных — под катом.
Читать дальше →

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

Изобретаем велосипед или пишем персептрон на С++. Часть 1 и 2

Время на прочтение7 мин
Количество просмотров16K

Изобретаем велосипед или пишем персептрон на C++. Часть 1


Напишем простую библиотеку для реализации персептрона на C++



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

Одежда умная, но мы умнее: как мы делали футболку с контролем осанки

Время на прочтение10 мин
Количество просмотров5.5K
Всем привет! Во втором семестре все первокурсники программы «Прикладная математика и информатика» в Питерской Вышке делают командные проекты по С++. Мы занимались разработкой умной футболки.

О том, что это такое и что мы успели сделать за время работы над проектом, читайте в этой статье.

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

CLion 2020.2: поддержка проектной модели Makefile, больше C++20 и не только

Время на прочтение8 мин
Количество просмотров6.1K
Привет, Хабр!

У нашей команды выдалось очень насыщенное лето, результатами которого мы и спешим сегодня поделиться. Итак, встречайте новый релиз CLion 2020.2!

CLion release

Коротко о том, что вошло в новую версию:

  • Поддержка проектной модели Makefile.
  • Последние обновления в CMake.
  • Новые возможности C++20: explicit(bool), назначенные инициализаторы (designated initializers), циклы for на основе диапазонов с инициализаторами.
  • Обновленный статический анализатор кода: анализ на висячие указатели (dangling pointers), поиск возможностей упрощения кода, поиск неиспользуемого кода, анализ возвращаемого значения функции, ограниченной концептом.
  • Юнит-тестирование: поддержка нового фреймворка doctest, новые возможности Catch2 и Google Test. А также упрощение сбора метрик покрытия кода.
  • Обновления в плагине PlatformIO для разработки встроенных систем.
  • Улучшения в поддержке систем контроля версий.
  • Улучшения производительности редактора.
  • Исправления в отладчиках.
Читать дальше →

Как можно и как нельзя использовать нулевой указатель в С++

Время на прочтение5 мин
Количество просмотров15K


Некоторым этот банальный вопрос уже набил оскомину, но мы взяли 7 примеров и попытались объяснить их поведение при помощи стандарта:


struct A {
    int data_mem;
    void non_static_mem_fn() {}
    static void static_mem_fn() {}
};

void foo(int) {}

A* p{nullptr};

/*1*/ *p;
/*2*/ foo((*p, 5));                     
/*3*/ A a{*p};
/*4*/ p->data_mem;
/*5*/ int b{p->data_mem};
/*6*/ p->non_static_mem_fn();
/*7*/ p->static_mem_fn();

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

Как изучить Android за 3 года, или История одного приложения

Время на прочтение10 мин
Количество просмотров10K

Всем привет!


Хочу рассказать историю о том, как я стал разработчиком под Android. Не в том смысле, что я сейчас этим зарабатываю на жизнь, а в том смысле, что из небольшого интереса к мобильной разработке я дорос до собственного приложения на PlayMarket. Но об этом чуть позже. История немного нетипична. Хотя, наверное, у каждого она своя.


Цель статьи — выплеснуть всё хорошее, что накопилось за несколько лет работы над проектом, а также поделиться своей историей (вдруг кому-то она покажется интересной). Ну, и попиариться немножко. Старался всё же, причём не только для себя. А потому буду рассказывать только о том, что делал сам, с помощью или без. Поехали.

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

can_throw или не can_throw?

Время на прочтение7 мин
Количество просмотров4.1K


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


К сожалению, далеко не везде исключения можно задействовать. Во-первых, исключения не бесплатны и, во-вторых, не всякий код способен "пережить" возникновение исключений.


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


По большому счету, у нас в распоряжении есть только спецификатор noexcept. Штука полезная, конечно, но недостаточная.


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

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

PVS-Studio: Анализ pull request-ов в Azure DevOps при помощи self-hosted агентов

Время на прочтение12 мин
Количество просмотров1.1K


Статический анализ кода показывает наибольшую эффективность во время внесения изменений в проект, поскольку ошибки всегда сложнее исправлять в будущем, чем не допустить их появления на ранних этапах. Мы продолжаем расширять варианты использования PVS-Studio в системах непрерывной разработки и покажем, как настроить анализ pull request-ов при помощи self-hosted агентов в Microsoft Azure DevOps, на примере игры Minetest.
Читать дальше →