Обновить
128K+

C++ *

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

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

Пример, как в PVS-Studio появляются новые диагностики

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

Новая Си++ диагностика для PVS-Studio


Пользователи иногда спрашивают, как появляются новые диагностики в статическом анализаторе PVS-Studio. Мы отвечаем, что черпаем вдохновение из разнообразнейших источников: книг, стандартов кодирования, собственных ошибок, писем наших пользователей и так далее. Сегодня мы придумали новую интересную диагностику и решили рассказать историю, как это произошло.

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

Полезные скрипты для WinDBG: команда !exccandidates

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

Некоторое время назад мы опубликовали в OpenSource небольшую библиотечку скриптов для популярного отладчика Windbg. Они предназначены для автоматизации ряда рутинных задач, возникающих при анализе причин падения программ как при отладке вживую, так и при работе с дампами памяти. Мы запланировали несколько постов, объясняющих, как эти скрипты использовать. Вот первый пост из данного цикла. Он демонстрирует использование команды !exccandidates на синтетическом примере.

Читать далее

Stm32 + USB на шаблонах C++

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

Продвигаясь в изучении программирования микроконтроллеров, я осознал необходимость освоить USB, поскольку это, бесспорно, основной интерфейс НЕ-внутрисхемного подключения устройств. Однако оказалось, что соответствующих материалов в открытом мире немного. Попробуем разобраться?

Попробуем

Vulkan. Руководство разработчика. Графический конвейер

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


Я переводчик в IT-компании CG Tribe, и я продолжаю выкладывать перевод руководства к Vulkan API (vulkan-tutorial.com).

Сегодня я хочу поделиться с вами переводом первых двух глав раздела, посвященного графическому конвейеру (Graphics pipeline basics), — Introduction и Shader modules.

Содержание
Читать дальше →

С чего начать писать микросервис на C++

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

Около 3х лет занимаюсь разработкой микросервисов, однако изначального понимания подходящего стека технологий у меня не было. Испробовал множество различных подходов(одними из которых были OpenDDS и apache-thrift), но в конце концов остановился на RestApi.

RestApi общается по средствам HTTP-запросов, которые в свою очередь представляют структуру данных из заголовков и тела запроса передаваемые через сокет. Первым на что я обратил внимание это boost/asio который предоставляет tcp-сокеты, но тут возникают сложности с объемами разработки:

Читать далее

Прочти меня: код, который не выбесит соседа

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


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

Я расскажу о подходах, которые мы используем в Яндекс.Такси для написания читаемого кода на C++, Python, JavaScript и других языках.
Читать дальше →

Доступ к элементам std::tuple во время исполнения программы

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

При тестировании разрабатываемой библиотеки математических алгоритмов для автономного вождения нашей команде приходилось достаточно много манипулировать с кортежами (std::tuple): итерироваться по каждому элементу кортежа или в произвольном порядке, выбирать элементы, чьи индексы и/или значения удовлетворяют определенному условию, и т.д. Написание для каждого случая отдельной рекурсивной функции прохода по кортежу, во-первых, требует знания основ метапрограммирования и шаблонной магии, а во-вторых, отнимает существенное количество времени разработчика.

Мне в голову пришла идея: а что если получать доступ к элементам по индексу, не известному на этапе компиляции?

Читать далее

Маленькие хитрости для STM32

Время на прочтение4 мин
Охват и читатели15K
В процессе работы у каждого программиста иногда встречаются неожиданные проблемы, которые возникли как будто на ровном месте. Практически по Черномырдину «никогда такого не было, и вот опять!». После этого начинаешь искать решение в интернете или закапываешься в чтение мануалов и документации, чтобы разобраться в пустячном, на первый взгляд вопросе.

Через какое-то время решение находится (или ошибка исправляется), и ты даешь себе зарок запомнить этот случай, а еще лучше записать, чтобы не забыть выясненный нюанс в будущем. Но проходит время и свое обещание счастливо забывается. И в этом нет ничего удивительного, если трудоемкость решения оказалась очень низкой, такой, что при желании его может повторить практически любой желающий буквально за несколько часов, правда если он будет знать, в какую строну следует копать.

Продолжая серию статей про маленькие хитрости разработки под STM32, хочу поделиться двумя очень простыми, но полезными функциями. Они никак не тянут на полноценный проект на github.com, но способны облегчить жизнь (или наоборот, выпить немало крови), при определенном стечении обстоятельств.

  1. Буферизированный вывод отладочной информации в последовательный порт
  2. Автоматическое включение защиты от чтения и модификации прошивки
Читать дальше →

Ленивые операции над множествами в C++

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

В C++ нет понятия "множество". Есть std::set, но это всё-таки конкретный контейнер. Есть функции для работы с упорядоченными диапазонами: merge, inplace_merge, includes, set_difference, set_intersection, set_symmetric_difference, set_union, но это алгоритмы, они не ленивые, и при вызове сразу вычисляют результат. К тому же они предназначены для работы строго с двумя диапазонами.


Что же делать, если, во-первых, диапазонов много (больше двух), а во-вторых, мы хотим вычислять результат не сразу, а по необходимости?


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


В публикации Ленивые итераторы и диапазоны в C++ я разбирал, что такое ленивые диапазоны.
Читать дальше →

Ленивые итераторы и диапазоны в C++

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

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


Однако есть и классическая, более распространённая техника для борьбы с циклами — использование итераторов и диапазонов для ленивых операций над последовательностями. Всё это уже сто лет есть в Бусте и других сторонних библиотеках (к примеру, range-v3) и постепенно просачивается в стандартную библиотеку.


Хотя, в некотором смысле, и в стандартной библиотеке ленивые итераторы уже есть давно (см. std::reverse_iterator).

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

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

Приёмы неблокирующего программирования: атомарные операции и частичные барьеры памяти

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

В первой статье цикла мы познакомились с простыми неблокирующими алгоритмами, а также рассмотрели отношение “happens before”, позволяющее их формализовать. Следующим шагом мы рассмотрим понятие «гонки данных» (data race), а также примитивы, которые позволяют избежать гонок данных. После этого познакомимся с атомарными примитивами, барьерами памяти, а также их использованием в механизме “seqcount”.


С барьерами памяти некоторые разработчики ядра Linux уже давно знакомы. Первый документ, содержащий что-то похожее на спецификацию гарантий, предоставляемых ядром при одновременном доступе к памяти — он так и называется: memory-barriers.txt. В этом файле описывается целый зоопарк барьеров вместе с ожидаемым поведением многопоточного кода в ядре. Также там описывается понятие «парных барьеров» (barrier pairing), что похоже на пары release-acquire операций и тоже помогает упорядочивать работу потоков.


В этой статье мы не будем закапываться так же глубоко, как memory-barriers.txt. Вместо этого мы сравним барьеры с моделью acquire и release-операций и рассмотрим, как они упрощают (или, можно сказать, делают возможной) реализацию примитива “seqcount”. К сожалению, даже если ограничиться лишь наиболее популярными применениями барьеров — это слишком обширная тема, поэтому о полных барьерах памяти мы поговорим в следующий раз.

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

Размещение кучи FreeRTOS в разделе CCMRAM для STM32

Время на прочтение2 мин
Охват и читатели11K
При разработке одного девайса на базе STM32F407 столкнулся с проблемой нехватки оперативной памяти. Назначение самого девайса не принципиально, но важно, что изначальный код писался для десктопной системы и его нужно было просто портировать на микроконтроллер под управлением FreeRTOS. А так как исходный код был написан на С++ и вопрос об экономии ОЗУ даже не стоял, то и вылезла соответствующая проблема.

Заниматься оптимизацией кода, одновременно добавляя себе проблем с поиском новых ошибок, очень не хотелось. Поэтому своевременно вспомнилось, что данная версия микроконтроллера имеет на борту дополнительный сегмент ОЗУ размером 64К (CCM SRAM), который сейчас никак не был задействован. Эврика — вот оно, решение!

Но к сожалению, все оказалось не так просто.

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

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

Динамический полиморфизм с использованием std::variant и std::visit

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

Динамический полиморфизм (или полиморфизм времени выполнения) обычно связан с v-таблицами и виртуальными функциями. Однако в этой статье я покажу вам современную технику C++, которая использует std::variant и std::visit. Этот метод C++17 может предложить вам не только лучшую производительность и семантику значений, но и интересные паттерны проектирования.

Читать далее

Введение в неблокирующие алгоритмы

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

Неблокирующие алгоритмы широко применяются в ядре Linux когда традиционные примитивы блокировки либо не могут быть использованы, либо недостаточно быстры. Эта тема многим интересна и время от времени всплывает на LWN. Из недавнего — вот эта июльская статья, которая собственно и сподвигла меня написать свою серию. Ещё чаще разговор заходит про механизм read-copy-update (RCU — руководство 2007 года всё ещё актуально), подсчёт ссылок, и способы сделать более понятные, высокоуровные API ко всему этому разнообразию. Ну а сейчас вас ждёт погружение в идеи, стоящие за неблокирующими алгоритмами, а также их использованием в ядре.


Знание низкоуровневой модели памяти в целом считается продвинутым уровнем понимания, которого страшатся даже опытные программисты-ядерщики. Словами нашего редактора (из его июльской статьи): «Понять модель памяти можно лишь правильно повёрнутым мозгом». Говорят, что моделью памяти Linux (и файлом memory-barriers.txt в частности) можно пугать детей. Порой для достижения эффекта достаточно всего лишь рявкнуть “acquire” или “release”.


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

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

Программа: исполняемая, управляющая или выполнимая или?

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

Русскоязычному программисту тяжело. Смыслы программирования рождаются на Западе и потом переводятся на другие языки, и этот перевод часто страдает. А вместе с ним страдает русскоязычный программист.

Читать далее

Как подключить содержимое любых файлов для использования в коде C / C++

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

Задача состояла в подключении файлов: HTML, JS, CSS; без специальной подготовки. Так же неудобно подключать бинарные файлы (например картинки) конвертируя их в HEX. Так как не хотелось конвертировать в HEX или разделять на строки, искал способ подключения файла в адресное пространство программы.

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

Вычисление динамических объектов по вектору

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

Допустим, у нас есть набор объектов с некими данными, и нам нужно произвести манипуляции с этими объектами.

Положим, самый обычный пример - наполнить корзинку фруктами. Мы реализуем некий класс Сart, в который будем складывать фрукты. Далее нам понадобиться базовый класс Fruit, для того, чтоб определить параметр объема, которому мы будем присваивать значение в зависимости от фрукта.

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

И вот тут начинается проблема. Да, наш класс стал более универсальным, но увеличиваться может не только количество проблем с фруктами, но и сами ситуации сбора фруктов могут быть различными. Например, мы собираем фрукты там, где абсолютно каждый плод будет свежим. Зачем, в таком случае, нам поле, отвечающее за свежесть, если все фрукты заведомо свежие? Мы выносим ряд опциональных типов в массив(словарь), где каждый тип не является непосредственной частью класса.

Однако, я решил пойти дальше, и немного развить эту тему.

Читать далее

Знакомство с EXtensible Server Core (exsc)

Время на прочтение7 мин
Охват и читатели2.1K
image

Всем привет! Хочу поделиться с общественностью фреймворком, на основе которого в данный момент множество серверов, обслуживают тысячи клиентов в различных серверных системах (по условиям контракта, продукты основанные на данном фреймворке не разглашаются). EXtensible Server Core (exsc) — это фреймворк, написанный на языке C и позволяет в рамках одного приложения, иметь один или несколько серверных потоков. Каждый серверный поток способен обслужить большое количество клиентов. Хотя фреймворк можно использовать в модели типа запрос-ответ, в первую очередь он был рассчитан на поддержание постоянного соединения с большим количеством клиентов и обменом сообщений в реальном времени.
Читать дальше →

Реализация двойной панели инструментов в QT

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

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

Ссылка на исходный код

Читать далее