Обновить
216.27

C++ *

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

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

Создаем свою STL-совместимую реализацию std::allocator с лучшей производительностью

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

Реализация защиты от сбоев из-за фрагментации кучи и повышение скорости выполнения с помощью STL-альтернативы std::allocator, работающей с блоками памяти фиксированного размера.

В этой статье описывается реализация STL-совместимого аллокатора, ориентированного на выделение и высвобождение блоков памяти фиксированного размера. Предложенный аллокатор предотвращает сбои, вызванные фрагментированной кучей, и обеспечивает стабильное время выполнения выделения/высвобождения памяти. Моей главной целью при создании stl_allocator было устранение ошибок памяти. Вдобавок использование STL-совместимого блочного аллокатора открывает возможность использования функций стандартной библиотеки шаблонов (STL) C++ в проектах, в которых иначе это было бы невозможно.

Читать далее

Дневник альтруиста. Причины

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров5.8K

CMake + C++ - это ночные кошмары или чудесный подарок судьбы? Начало истории о том, как легко отстрелить себе ногу в попытках сделать мир чуть более юзер-френдли.

Читать далее

Zoom в Qt виджете

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

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

Читать далее

Какой тип ordering должен возвращать мой operator<=> в C++?

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

На Хабре было опубликовано уже достаточно статей, посвященных «spaceship operator» operator<=> ([1], [2], [3], [4]) И этой статьи бы не было, если бы все они были идеальны и описывали его во всей полноте. Но ни одна из них в деталях не рассказывает: а какой тип, собственно, должен возвращать наш operator<=>, если мы реализуем его своими руками: std::strong_ordering, std::weak_ordering или std::partial_ordering? И какая вообще между ними разница?

Читать далее

Разреженные структуры данных

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

Когда-то я писал пост про различные интересные структуры данных. Среди них был т.н. sparse set. Там мы описали его в общих чертах, опустив некоторые детали (которыми позже статья была дополнена). Но кроме sparse set существуют и другие разреженные структуры данных! На них сегодня и посмотрим : )

Разредиться!

Qt Creator* ищет ошибки в Qt Creator

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

Как-то так странно получилось, что у нас уже почти год как существует и поддерживается плагин PVS-Studio для Qt Creator. И при этом мы до сих пор не выпустили хорошей статьи с проверкой самой IDE. Исправляем сие недоразумение и предлагаем вам посмотреть, чем живёт недавно переродившаяся среда для разработки.

Читать далее

Настройка C++ проекта c OpenMP. Обертывание С++ для Python с помощью pybind11 и CMake

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров5.2K

В статье описан практический пример настройки проекта на языке C++ с использованием, в качестве примера, библиотеки для многопоточных вычислений OpenMP , а также дальнейшее обёртывание для использования в проектах написанных на Python при помощи библиотеки Pybind11. В качестве системы сборки используется CMake. Основное внимание уделено именно сборке проекта. В качестве инструмента обёртывания используется библиотека pybind11, в качестве системы сборки CMake.

Читать далее

Написание минимальной подсистемы хранения данных в памяти для MySQL/MariaDB

Уровень сложностиСредний
Время на прочтение24 мин
Количество просмотров6.5K

Я потратил неделю, копаясь во внутренностях MySQL/MariaDB вместе с ещё примерно 80 разработчиками. Хотя MySQL и MariaDB — это, по большей части, одно и то же (я ещё к этому вернусь), я сосредоточился именно на MariaDB.

Раньше я никогда сам не собирал MySQL/MariaDB. В первый день «недели хакерства» я смог наладить локальную сборку MariaDB и твикнул код так, что запрос SELECT 23 возвращал 213. Сделал я и другой твик — такой, что запрос SELECT 80 + 20 возвращал 60. На второй день я смог заставить заработать простую UDF на C, благодаря которой запрос SELECT mysum(20, 30) давал 50.

Остаток недели я потратил, пытаясь разобраться с тем, как сделать минимальный движок для хранения данных в памяти. Именно о нём я и расскажу. Это — 218 строк кода на C++.

Читать далее

Объявление и инициализация переменных в C++

Уровень сложностиСредний
Время на прочтение41 мин
Количество просмотров38K


Продолжаем серию «C++, копаем вглубь». Цель этой серии — рассказать максимально подробно о разных особенностях языка, возможно довольно специальных. Это шестая статья из серии, список предыдущих статей приведен в конце в разделе 7. Серия ориентирована на программистов, имеющих определенный опыт работы на C++. Данная статья посвящена объявлению и инициализации переменных.


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


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

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

Миландр + GCC + VSCode. Пробуем мигать светодиодом на отечественном ARM32 микроконтроллере

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

Год назад я написал статью об отладке STM32 микроконтроллеров из под VSCode, с компиляцией в GCC и сборкой с помощью CMake. А в декабре мне в руки попали две тестовые единицы отечественных микроконтроллеров К1986ВЕ92FI (MDR1211FI1). Производитель имеет свою библиотеку SPL на C, а также неплохую базу примеров инициализации и применения различной периферии в Keil и IAR; однако я, average C++20+ enjoyer , решил попробовать перенести свой тулчейн на новое железо.

Читать далее

Механизм перезапускаемых последовательностей (Rseq) при работе с TCMalloc

Уровень сложностиСложный
Время на прочтение11 мин
Количество просмотров2.4K


Кэши для отдельных ядер процессора


В TCMalloc кэши для отдельных ядер процессора реализуются при помощи перезапускаемых последовательностей (man rseq(2)) под Linux. Эту возможность ядра разработали Пол Тёрнер и Эндрю Хантер из Google, а также Мэтью Дезнойерс из EfficiOS. При помощи перезапускаемых последовательностей можно вплоть до завершения выполнять область памяти (атомарно, относительно других потоков, выполняющихся на том же ядре процессора), либо выходить из этого процесса, если ядро прервёт этот процесс, например, вытеснив его или прервавшись на обработку сигнала.

Если вы хотите организовать перезапуск системы при миграции с ядра на ядро или при вытеснении процесса, то наиболее общий случай такой операции можно оптимизировать (не переносить с ядра на ядро тот процесс, который уже выполняется), избегая атомарных операций. Можно оптимизировать и более редкий случай – вытеснение как таковое. В результате такого компромисса нужно обеспечить, чтобы на всех путях выполнения нашего кода поддерживались такие операции перезапуска. Вся последовательность, кроме окончательного сохранения в памяти, когда изменение фиксируется, должна быть приспособлена к перезапуску.
Читать дальше →

Передавать пустые срезы между Rust и C/C++ на удивление сложно

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров9K

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

В общих чертах она выглядит так:

  • В правила работы с указателями и memcpy в С не заложены грамотные способы представления пустого среза памяти.
  • В С++ с правилами указателей проблем нет, но поведение memcpy здесь аналогично её поведению в С.
  • Интерфейс внешних функций (Foreign Function Interface, FFI) в Rust не лишён накладных издержек. Rust использует несовместимое с C/C++ представление срезов, требуя их преобразования при передаче в обоих направлениях. При этом о преобразовании очень легко забыть.
  • Срезы в Rust также несовместимы с арифметикой указателей, что создаёт проблемы в работе итератора срезов стандартной библиотеки. (Обновление от 2024-01-16: похоже, над этой проблемой работают).

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

От винта! Смотрим движок War Thunder и говорим с его создателями

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров12K

Как говорил Юрий Гагарин: "В будущем мы будем летать, много летать". В определённой мере игровой движок Dagor Engine от Gaijin Entertainment позволяет это сделать. Давайте посмотрим, как он сделан, и поговорим с его создателями!

Поехали!

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

Действительно ли C++ — лучший язык, чтобы выстрелить себе в ногу?

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров33K
В 2023 году одной из главных IT-новостей стала публикация гайда от Агентства национальной безопасности (NSA) США, в котором языки С/C+ признавались «опасными» и требующими перехода на «безопасные» C#, Go, Java, Ruby и Swift.

В этой статье я с позиции Security Champion на одном из продуктов, использующих KasperskyOS, собственную микроядерную операционную систему «Лаборатории Касперского», расскажу, так ли плохо обстоят дела с безопасностью в С++ на самом деле, а также разберу различные подходы к митигации описанных проблем, которые современная индустрия предлагает для решения данного вопроса.
Читать дальше →

Игры для ESPspectrum

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров2.5K

Создание игр для ESPspectrum. Пошаговая инструкция.

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

Читать далее

Многообразие функциональных обёрток

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров4.1K

В далёком 2002-ом комитет по стандартизации C++ посетил пропозал, предлагавший ввести шаблонный класс, некий обобщенный «указатель на функцию», способный работать как с простыми указателями на функции, указателями на методы классов, так и с произвольными функциональными объектами [1].

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

Кто же знал, что его окажется недостаточно, а один из его юзкейсов — вовсе не его юзкейс?

Читать далее

Нельзя писать безопасный код на C++ без санитайзеров

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров20K

С++ видится мне огромным франкенштейном: очень уж много разнообразных способов описать свои намерения. В добавок к этому язык пропагандирует политику zero-cost abstractions, из которой следует (помимо прочего), что программист в ответе за все свои действия. Однако, работая с большими кодовыми базами, становится крайне тяжело держать в уме различные тонкости языка, которые держать в уме нужно — иначе Undefined Behavior.

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

Читать далее

ESPspectrum V1.1 + версия для проектов

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

ESPspectrum третья статья. Версия 1.1. Доработка первого экземпляра. Создание ESPspectrum for projects. Схемы и описание.

Читать далее

Зимняя школа по RISC-V — актуальные знания по перспективной открытой архитектуре от экспертов

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров3.7K

С 2 по 8 февраля пройдет Зимняя школа «Программирование для RISC-V» — недельный интенсив от YADRO и ННГУ им. Н.И. Лобачевского. Программа состоит из двух частей: онлайн-лектория и очной проектной работы.

На бесплатных онлайн-лекциях все желающие познакомятся с основами разработки на основе открытой архитектуры RISC-V — перспективной технологии, предназначенной для создания процессоров, микроконтроллеров и разработки ПО. Лекции позволят вам выстроить полноценное представление об архитектуре и ее особенностях: вы начнете с азов, а закончите изучением векторных расширений RISC-V и ее возможностей для высокопроизводительных вычислений. Информация подойдет и новичкам в теме, и тем, кто знает теорию и хочет делать первые практические шаги в разработке под новую архитектуру. 

А студенты очной формы обучения смогут решить реальную задачу, связанную с RISC-V, под руководством преподавателей Университета Лобачевского и разработчиков YADRO на базе вуза в Нижнем Новгороде. 

Подробнее о лекциях и проектах, а также о том, как стать участником школы, читайте под катом.

Узнать больше →

Что нам недодали в C++

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров26K

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

Читать далее

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