Обновить
377.86

C++ *

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

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

Релиз CLion 2016.2: удаленная отладка, поддержка формата Doxygen, новые возможности кодогенерации и многое другое

Время на прочтение7 мин
Охват и читатели13K
Привет, Хабр!

Чуть больше года прошло с момента первого релиза нашей кросс-платформенной IDE для разработки на C и C++. За это время у нас появились десятки тысяч пользователей, среди клиентов встречаются такие организации, как NASA и AirBnB, а самый популярный запрос в трекере набрал более 500 голосов. И кстати, мы не зря просим вас голосовать за те запросы, которые вам наиболее интересны или актуальны. Наша очередь задач на разработку зависит от вашего мнения и ваших голосов в первую очередь. Именно поэтому релиз 2016.2 включает в себя так много долгожданных возможностей!



А теперь обо всем по порядку.
Читать дальше →

Два в одном: USB хост и составное USB устройство

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

image



Не так давно, была опубликована статья «Пастильда — открытый аппаратный менеджер паролей». Так как данный проект является открытым, то мы решили, что будет интересно, если мы будем писать небольшие заметки о процессе проектирования, о задачах, которые перед нами стоят и о трудностях, с которыми мы сталкиваемся.

Основная суть Пастильды заключается в том, что она является своеобразным переходником между клавиатурой и ПК. Таким образом, она должна уметь:
  • быть USB хостом для клавиатуры, которая к ней подключается,
  • быть клавиатурой для ПК, чтобы либо перенаправлять сообщения от реальной клавиатуры, либо самой быть клавиатурой,
  • быть дисковым накопителем, чтобы можно было редактировать базу данных паролей в удобном для человека виде.

Данный функционал является скелетом нашего проекта, поэтому первая заметка будет посвящена именно ему.
Читать дальше →

Оптимизация обработки изображений с использованием GPU на примере Медианной фильтрации

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

Введение


Издавна графические ускорители (ГПУ) были созданы для обработки изображения и видео. В какой то момент ГПУ стали использоваться для вычислений общего назначения. Но развитие центральных процессоров тоже не стояло на месте: компания Intel ведет активные разработки в сторону развития векторных расширений (AVX256, AVX512, AVX1024). В итоге, появляются разные процессоры — Core, Xeon, Xeon Phi. Обработку изображений можно отнести к такому классу алгоритмов, которые легко векторизуются.
Но как показывает практика, несмотря на довольно высокий уровень компиляторов и технологичность центральных процессоров и сопроцессоров Xeon Phi, сделать обработку изображения с использованием векторных инструкций не так просто, так как современные компиляторы плохо справляются с автоматической векторизацией, а использовать векторные intrinsic функции достаточно трудоемко. Также возникает вопрос о совмещении векторизованного вручную кода и скалярных участков.

Стоит ли использовать GPU, вместо AVX? ответ далее

Последние новости о развитии C++

Время на прочтение7 мин
Охват и читатели77K
Недавно в финском городе Оулу завершилась встреча международной рабочей группы WG21 по стандартизации C++, в которой впервые официально участвовали сотрудники Яндекса. На ней утвердили черновой вариант C++17 со множеством новых классов, методов и полезных нововведений языка.



Во время поездки мы обедали с Бьярне Строуструпом, катались в лифте с Гербом Саттером, жали руку Беману Дейвсу, выходили «подышать воздухом» с Винцентом Боте, обсуждали онлайн-игры с Гором Нишановым, были на приёме в мэрии Оулу и общались с мэром. А ещё мы вместе со всеми с 8:30 до 17:30 работали над новым стандартом C++, зачастую собираясь в 20:00, чтобы ещё четыре часика поработать и успеть добавить пару хороших вещей.

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

Анализ производительности отдельных подсистем программы по Linux perf report

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

Обычно для подготовки отчета по профилированию на Linux я использовал только самые простые варианты запуска perf report (сами данные по производительности должны быть получены до запуска perf report командой perf record, вот тут можно подробнее прочесть с примером):


Отчет по модулям:


$ perf report --stdio --kallsyms=/boot/System.map-$(uname -r) --sort=dso -g none

Отчет по функциям:


perf report -g none --stdio --kallsyms=/boot/System.map-$(uname -r)

Отчет по функциям с построением callgraph:


perf report --stdio --kallsyms=/boot/System.map-$(uname -r) -g

Для многих ситуаций таких отчетов было вполне достаточно, чтобы найти проблемы с производительностью. Однако некоторое время назад я столкнулся с ситуацией когда отчет по callgraph показывал очень большое дерево вызовов и его было затруднительно понимать.

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

Функторы (глава книги «Теория категорий для программистов»)

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

Это седьмая статья из цикла «Теория категорий для программистов». Предыдущие статьи уже публиковались на Хабре:



Функторы


За понятием функтора стоит очень простая, но мощная идея (как бы заезжено это ни прозвучало). Просто теория категорий полна простых и мощных идей. Функтор есть отображение между категориями. Пусть даны две категории C и D, а функтор F отображает объекты из C в объекты из D — это функция над объектами. Если a — это объект из C, то будем обозначать его образ из D как F a (без скобок). Но ведь категория — это не только объекты, но еще и соединяющие их морфизмы. Функтор также отображает и морфизмы — это функция над морфизмами. Но морфизмы отображаются не как попало, а так, чтобы сохранять связи. А именно, если морфизм f из C связывает объект a с объектом b,


f :: a -> b

то образ f в D, F f, связывает образ a с образом b:


F f :: F a -> F b

(Надеемся, что такая смесь математических обозначений и синтаксиса Haskell понятна читателю. Мы не будем писать скобки, применяя функторы к объектам или морфизмам.)


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

Воспроизводим mp3 в своей программе и что может этому помешать

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

Вступительная


Давным-давно, лет 100 10 тому назад, когда только прокрастинация начала захватывать мой разум, я решил, что пока я еще в состоянии им (разумом) пользоваться, надо срочно строить себе спасательную шлюпку, дабы не утонуть в пучине отложенных дел. Конечно, на тот момент уже существовало достаточно количество различных напоминалок, будильников, шедулеров и прочих разных «умных» часов, но, как водится, свое — оно всегда ближе и понятнее, чем чужое, даже с мегабайтами файлов справки. Да и зря, что ли, книжку по бейсику у друга одолжил?

Но, как водится, обо всем по порядку.

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

Концепты для отчаявшихся

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

Всё началось с того, что мне понадобилось написать функцию, принимающую на себя владение произвольным объектом. Казалось бы, что может быть проще:


template <typename T>
void f (T t)
{
    // Завладели экземпляром `t` типа `T`.
    ...

    // Хочешь — переноси.
    g(std::move(t));

    // Не хочешь — не переноси.
    ...
}

Но есть один нюанс: требуется, чтобы принимаемый объект был строго rvalue. Следовательно, нужно:


  1. Сообщать об ошибке компиляции при попытке передать lvalue.
  2. Избежать лишнего вызова конструктора при создании объекта на стеке.

А вот это уже сложнее сделать.


Поясню.

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

Распознавание паспорта РФ на платформе Эльбрус. Часть 1

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

В этой статье мы продолжим рассказывать о похождениях нашей программы распознавания паспорта: теперь паспорт отправится на Эльбрус!



Итак, что же мы знаем про архитектуру Эльбрус?


Эльбрус — высокопроизводительная и энергоэффективная архитектура процессоров, отличающаяся высокой безопасностью и надежностью. Современные процессоры архитектуры Эльбрус могут применяться в качестве серверов, настольных компьютеров и даже встраиваемых вычислителей. Они способны удовлетворить повышенным требованиям по информационной безопасности, рабочему диапазону температур и длительности жизненного цикла продукции. Процессоры архитектуры Эльбрус, как говорят нам публикации МЦСТ [1, 2], предназначены для решения задач обработки сигналов, математического моделирования, научных расчетов, а также других задач с повышенными требованиями к вычислительной мощности.


Мы в Smart Engines попробовали убедиться, правда ли производительности Эльбруса достаточно, чтобы реализовать распознавание паспорта без значительных потерь в скорости работы.

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

PVS-Studio спешит на помощь CERN: проверка проекта Geant4

Время на прочтение12 мин
Охват и читатели11K
PVS-Studio спешит на помощь CERNПроект Geant4 продолжает развиваться, поэтому интересно вновь проверить его с помощью статического анализатора кода PVS-Studio. На этот раз проверке будет подвергнута версия 10.2 (предыдущая проверка относилась к версии 10.0-beta).
Читать дальше →

Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux

Время на прочтение14 мин
Охват и читатели10K
Это продолжение статьи «Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux».

Там мы получили возможность использования классов .Net в неуправляемом приложении. Теперь воспользуемся «Создание компонент с использованием технологии Native API».

Итак, начнем.
Читать дальше →

Перевод С++ проекта на разработку с юнит-тестированием/TDD

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

Полгода назад на моем проекте было примерно около 0% покрытие кода юнит-тестами. Простых классов было достаточно мало, создавать для них юнит-тесты было легко, но это было относительно бесполезно, так как на самом деле важные алгоритмы находились в сложных классах. А сложные, с точки зрения поведения, классы было трудно юнит-тестировать так как такие классы были завязаны на другие сложные классы и классы конфигурации. Создать объект сложного класса и тем более его протестировать юнит-тестами было невозможно.


Некоторое время назад я прочёл "Writing Testable Code" в Google Testing Blog .


Ключевая идея в статье заключается в том, что C++ код, пригодный для юнит-тестирования, пишется совсем не так, как привычный C++ код.

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

Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux

Время на прочтение13 мин
Охват и читатели8.5K
Будучи программистом 1С, мне часто приходится использовать классы .Net через различные прослойки.

Использование сборок .Net через обертку реализующую IReflect
Для подключения .NET сборок используется «CLR Hosting API»
1C.Net: Предприятие – пример коммерческого успеха .Net-решений в России
Как вызвать метод из C# в 1С?

Но все они используют в той или иной степени COM. С появлением .Net Core стало возможным использование сборок .Net и на любой оси отличной от Windows.

На просторах интернета было найдено решение: Hosting .NET Core Clr in your own process и simpleCoreCLRHost и
initializeCoreCLR createDelegate и
unixinterface

Суть подключения заключается в загрузке библиотеки coreclr.dll, получения нужных интерфейсов и запуск CLR Runtime Host.
Читать дальше →

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

SObjectizer: что это, для чего это и почему это выглядит именно так?

Время на прочтение15 мин
Охват и читатели21K
Разработка многопоточных программ на C++ — это не просто. Разработка больших многопоточных программ на C++ — это очень не просто. Но, как это обычно бывает в C++, жизнь сильно упрощается, если удается подобрать или сделать «заточенный» под конкретную задачу инструмент. Четырнадцать лет назад выбирать было особенно не из чего, поэтому мы сами для себя сделали такой «заточенный» инструмент и назвали его SObjectizer. Опыт повседневного использования SObjectizer-а в коммерческом софтостроении пока не позволяет жалеть о содеянном. А раз так, то почему бы не попробовать рассказать о том, что это, для чего это и почему у нас получилось именно так, а не иначе…
Читать дальше →

std::shared_ptr и кастомный аллокатор

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

Кто из нас не любит рефакторинг? Думаю, что неоднократно каждый из нас при рефакторинге старого кода открывал для себя что-то новое или вспоминал что-то важное, но хорошо забытое. Совсем недавно, несколько освежив свои знания работы std::shared_ptr при использовании пользовательского аллокатора, я решил что больше забывать их не стоит. Всё что удалось освежилось собрал в этой статье.

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

Анализ потокобезопасности в С++

Время на прочтение11 мин
Охват и читатели14K
Писать многопоточные приложения нелегко. Некоторые средства статического анализа кода позволяют помочь разработчикам, давая возможность чётко определить политики поведения потоков и обеспечить автоматическую проверку выполнения этих политик. Благодаря этому появляется возможность отлавливать состояния гонки потоков или их взаимной блокировки. Эта статья описывает инструмент анализа потокобезопасности С++ кода, встроенный в компилятор Clang. Его можно включить с помощью опции командной строки −Wthread−safety. Данный подход широко распространён в компании Google — полученные от его применения преимущества привели к повсеместному добровольному использованию данной технологии различными командами. Вопреки популярному мнению, необходимость в дополнительных аннотациях кода не стала бременем, а наоборот, дала свои плоды выражающиеся в упрощении поддержки и развития кода.

Предисловие

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

Средства статического анализа кода помогают разработчикам определить политики потокобезопасности и проверять их при сборке проекта. Примером таких политик могут быть утверждения «мьютекс mu всегда должен использоваться при доступе к переменной accountBalance» или «метод draw() должен вызываться только из GUI-потока». Формальное определение политик даёт два основных преимущества:

  1. Компилятор может показывать предупреждения в случае обнаружения нарушений политик. Нахождение ошибки на этапе компиляции значительно дешевле, чем отладка упавших юнит-тестов или, что ещё хуже, появление «плавающих» багов в продакшн-коде.
  2. Явно выраженные в коде спецификации потокобезопасности играют роль документации. Подобная документация очень важна для библиотек и SDK, поскольку программистам нужно знать, как их корректно использовать. Данную информацию, конечно, можно поместить в комментарии, однако практика показывает, что подобные комментарии имеют свойство устаревать, поскольку при обновлении кода они не всегда меняются синхронно.


Данная статья рассказывает о применении данного подхода в Clang, хотя изначально он был разработан для GCC, однако версия для GCC более не поддерживается. В Clang данная возможность реализована как предупреждение компилятора. В Google на данный момент вся кодовая база C++ компилируется с включенным по умолчанию анализом потокобезопасности.
Читать дальше →

Единорог, который смог

Время на прочтение6 мин
Охват и читатели15K
The Little Unicorn That CouldОдна из команд разработчиков Microsoft уже использует в работе анализатор PVS-Studio. Это хорошо, но недостаточно. Поэтому я продолжаю демонстрировать, какую пользу может приносить статический анализ кода на примере проектов Microsoft. Три года назад мы проверяли проект Casablanca и не смогли в нём ничего обнаружить. За это проект был отмечен медалью «безбажный код». Прошло время, проект развивался и рос. В свою очередь, анализатор PVS-Studio существенно продвинулся в возможностях анализа кода. И наконец я могу написать статью об ошибках, которые анализатор выявляет в проекте Casablanca (C++ REST SDK). Ошибок мало, но то, что теперь их достаточно для написания статьи, говорит о эффективности PVS-Studio.
Читать дальше →

Опыт разработки управляющего ПО для квеструма

Время на прочтение8 мин
Охват и читатели7.9K
Последние год-полтора пользуются большой популярностью т.н. квеструмы, квесты «выйди из комнаты» реализованные в реальной жизни. Когда я ходил на первые квесты, большая часть задачек сводилась к поиску ключей и кодов для механических замков, магнитные замки были чем-то крутым и редким, не говоря уже о беспроводных интерфейсах, но чем дальше, тем более технически сложным становится это развлечение. В конце зимы мой друг, работающий в одной из таких контор, попросил помощи в написании управляющей программы для одного из их квестов, поскольку у них слился программист и начали гореть сроки. Задача была интересной, деньги неплохими, да и хорошего человека выручить не грех, поэтому я согласился, хоть и обидно было понимать, что на этот квест я не пойду, так как буду знать весь его сценарий. Сроки изначально ставилися очень сжатые, поэтому для разработки я выбрал привычную среду С++\Qt5.5.
Быстро стало понятно, что я совершил большую глупость, взявшись за работу с не очень хорошо прописанным тз, но подозреваю, что эту ошибку так или иначе совершал каждый, поэтому смысла о ней писать никакого, это не подводный камень, это самые обычные грабли.

С аппаратной точки зрения управляемая часть квеста выглядит следующим образом:
  • Основной компьютер, стоящий в операторской, на котором работает программа
  • Две звуковые карты в нём, к каждой из которых подключено по 5 колонок
  • Телевизор, подключенный вторым экраном
  • Два USB-свистка, являющиеся переходниками с USB на COM-интерфейс
  • Пачка диммеров и релейников, управляемых по MODBUS


В первичной постановке задача выглядела довольно простой, читать данные по MODBUS, писать данные по MODBUS, в нужные моменты проигрывать звук в нужную колонку и видео на второй экран. Как показала практика, всё это действительно делается не очень сложно. Но вот понять, как это сделать не очень сложно — уже не столь банально.
Читать дальше →

QtQuick/QML в качестве игрового UI

Время на прочтение15 мин
Охват и читатели28K
Статья обновлена с учётом полезных комментариев. Большое спасибо всем комментаторам за важные уточнения и дополнения.

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

Выходом является использование готовых универсальных UI библиотек. Текущее их поколение представлено такими «монстрами» как Scaleform и Coherent UI, хотя если вам так хочется писать UI на HTML, то можно и просто взять Awesomium.

К сожалению, у этой троицы, при всех её преимуществах, есть один существенный недостаток — жуткие тормоза, особенно на мобильных устройствах (несколько лет назад, я лично наблюдал, как практически пустой экран на Scaleform потреблял 50% от времени кадра на iPhone4).

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

Впрочем, причина, по которой именно привычные старые Qt Widgets не используются в играх, лежит на поверхности: они не рассчитаны на использование совместно с OpenGL или DirectX рендером. Попытки их скрестить дают довольно плохую производительность даже на десктопе, а про мобилки и говорить нечего.

Однако, уже довольно давно в Qt есть гораздо более подходящая для этой задачи библиотека: QtQuick. Её контролы по умолчанию рендерятся ускоренно, а возможность задавать описание UI в текстовом формате отлично подходит для быстрой настройки и изменения внешнего вида игры.

Тем не менее, я до сих пор не слышал об использовании Qt в профессиональном геймдеве. Статей на тему тоже не нашлось, поэтому я решил разобраться сам — то ли все что-то знают, чего не знаю я (но не рассказывают!), то ли просто не видят хорошую возможность сэкономить на времени разработки.
Читать дальше →

Relinx — ещё одна реализация .NET LINQ методов на C++, с поддержкой «ленивых вычислений»

Время на прочтение7 мин
Охват и читатели7.9K
RelinxLogo
(ОБНОВЛЕНО!)
Среди многих реализаций LINQ-подобных библиотек на C++, есть много интересных, полезных и эффективных. Но на мой взгляд, большинство из них написаны с неким пренебрежением к C++ как к языку. Весь код этих библиотек написан так, словно пытаются исправить его «уродливость». Признаюсь, я люблю C++. И как бы его не поливали грязью, моя любовь к нему едва ли пройдёт. Возможно, это отчасти потому, что это мой первый язык программирования высокого уровня и второй, который я изучил после Ассемблера.
Читать дальше →