Как стать автором
Обновить
204.59
Рейтинг

C++ *

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

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

Boson — разработка СУБД «с нуля» (часть II)

C++ *Системное программирование *Алгоритмы *Хранение данных *

В первой части статьи мы обсуждали разработку самого нижнего слоя СУБД Boson - CachedFileIO. Как упоминалось, статистика такого явления как Locality of Reference говорит о том, что в реальных приложениях ~95% запросов к данным локализованы в 10-15% базы данных. При этом среднее соотношение чтения/записи - 70%/30%. Это делает эффективным использование кэша (cache) работающего на основе алгоритма Least Recently Used (LRU). Реализовав его, мы получили 260%-600% прироста скорости чтения при 87%-97% cache hits.

Следующим после кэша слоем СУБД Boson является хранилище записей RecordFileIO. Это уже первый прообраз базы данных, который начинает приносить прикладную пользу. Сформулируем верхнеуровневую спецификацию требований:

Читать далее
Всего голосов 14: ↑13 и ↓1 +12
Просмотры 1.3K
Комментарии 9

Новости

Производительность параллельных алгоритмов STL

Блог компании OTUS Программирование *C++ *
Перевод

В этой статье я собираюсь провести тест производительности на компиляторе Microsoft и компиляторе GCC, чтобы ответить на простой вопрос: окупается ли политика выполнения?

 

Читать далее
Всего голосов 1: ↑1 и ↓0 +1
Просмотры 1.9K
Комментарии 0

Просто о RCU (Read–Copy-Update)

Программирование *C++ *C *Разработка под Linux *
Из песочницы

Lock-free структуры данных в общем и целом неплохо описаны в различной литературе, но на мой взгляд порог вхождения в эту тему высок. Приведу простой кейс использования одной из разновидностей данной технологии под названием RCU (Read–Copy-Update). В двух словах, это механизм неблокирующего обновления структуры данных у которой много читателей и всего один писатель. Wikipedia.

Читать далее
Всего голосов 15: ↑12 и ↓3 +9
Просмотры 2.8K
Комментарии 0

Размышление об Active Object в контексте Qt6. Часть 2.6

C++ *Qt *
Туториал

В предыдущей части цикла я описал способ вызова слота посредством очереди обработки сигнально-слотовых соединений Qt (она же очередь событий). Но совсем забыл про такую штуку, как QMetaObject::invokeMethod. А ведь эта штука позволяет добиться такого же эффекта (вызов метода в потоке-владельце QObject), но без необходимости создания сигнала.

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Просмотры 744
Комментарии 2

Рекурсивные регулярные выражения

C++ *Node.JS *API *IT-компании
Аналитика

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

Стал делать и подумал, а почему бы мне не добавить туда своих тараканов. Я решил добавить две конструкции:

{namesubexpression} - вызов под выражения по имени "namesubexpression",
($namesubexpression:BodyExpression) - описание под выражения с именем "namesubexpression".

Само описание под выражения может встречаться в любом месте структуры регулярного выражения и игнорируется при поиске, подобно закоментированым: (#MeComment).
Сразу же возникает проблема бесконечной рекурсии.
Вот пример рекурсивного регулярного выражения, который недопустим: ($E:{E}){E}

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

Вот пример текста, который можно спарсить рекурсивным регулярным выражением (РРВ): [[[[[A]]]]]
А вот его РРВ: ($RRE:\[({RRE}|A)\]){RRE}

Я также решил добавить три зарезервированные конструкции:
{:String} соответствует выражению: (("(\\.|[^"])*")|('(\\.|[^'])*'))
{:Digit} соответствует выражению: (-?[0-9]+.?[0-9]*[Ee]?-?[0-9]*)
{:Name} соответствует выражению: ([A-Za-z][A-Za-z0-9]*)
Но их поисковая система не использует структурные элементы аналогичных выражений, а организованна встроенным машинным поиском, который работает значительно быстрее и возвращает одну целую строку текста, в которой содержится всё тело найденного соответствия а не части для каждого компонента в аналогичных регулярных выражениях.

Читать далее
Всего голосов 9: ↑5 и ↓4 +1
Просмотры 5.4K
Комментарии 20

Кодогенератор Waffle++ для C++

C++ *Компиляторы *

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

Я делаю расширяемый кодогенератор для C++, в котором можно реализовать много полезного. Примеры модулей: перевод значений enum в строку и обратно, перевод структуры в JSON и обратно, декларативный веб-сервер, система слотов и сигналов, свой динамический полиморфизм, генератор кода для тестов...

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

Читать далее
Всего голосов 21: ↑21 и ↓0 +21
Просмотры 4.9K
Комментарии 12

Подводные камни компараторов в С++

Блог компании «Лаборатория Касперского» Программирование *C++ *Алгоритмы *Отладка *
При использовании компаратора в алгоритмах boost::sort и std::sort важно учитывать некоторые особенности работы этих алгоритмов, игнорирование которых может привести к неожиданным последствиям, в том числе к segmentation fault.

image

Чаще всего при сортировке объектов пользовательских типов написание кода сравнения элементов коллекции не вызывает вопросов. Компаратор должен возвращать true, если первый аргумент меньше второго, то есть в отсортированном массиве первый аргумент должен идти перед вторым. Алгоритмы сначала вызывают компаратор для пары элементов x и y. Если компаратор вернул true, значит, элемент x меньше y и он должен идти в коллекции перед элементом y, если false, то компаратор вызывается повторно для пары y и x. Если компаратор опять вернул false, значит, элементы равны, иначе порядок определен.

Меня зовут Олег Игнатов, я — Development Team Lead в команде KICS (Kaspersky Industrial CyberSecurity) «Лаборатории Касперского». Мы защищаем промышленные инфраструктуры и сети от специализированных киберугроз. В этой статье расскажу о некоторых особенностях использования компараторов в С++, знание которых позволит не наступить на различные грабли и сэкономить время при разборе багов.
Читать дальше →
Всего голосов 29: ↑28 и ↓1 +27
Просмотры 4.5K
Комментарии 14

Неполная, неточная и наполовину выдуманная история исключений

Программирование *.NET *C++ *Go *Rust *

Давным-давно, когда деревья были маленькие, дискеты большие, а трава зеленая, все писали на языках низкого уровня. В этих языках все было целыми числами. Переменные были числами, массивы были и структуры были просто адресами (числами) и смещениями (тоже числами). Даже если указывали тип данных, то он определял только размер памяти для значения.

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

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

Читать далее
Всего голосов 24: ↑23 и ↓1 +22
Просмотры 5.7K
Комментарии 121

Размышление об Active Object в контексте Qt6. Часть 3. HttpManager

C++ *Qt *
Туториал

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

Пришло время, наконец, сделать что-то более реальное и существенное, пусть и не очень сложное. И этим будет менеджер http запросов.

Читать далее
Всего голосов 1: ↑1 и ↓0 +1
Просмотры 983
Комментарии 0

Размышление об Active Object в контексте Qt6. Часть 2.5

C++ *Qt *

Статья выпущена как дополнение к предыдущей и показывает, как можно сделать Active object, работающий асинхронно в среде Qt, но при этом не использующий события.

Читать далее
Всего голосов 11: ↑11 и ↓0 +11
Просмотры 1.4K
Комментарии 2

C++ по итогам 2022-го

Блог компании JUG Ru Group C++ *Конференции
Ретроспектива
Перевод

Должен признать, что в некоторые из предыдущих лет C++ мог ощущаться немного «скучным» и «стабильным». Новые фичи, новый стандарт каждые три года, встречи, конференции... обычная жизнь (не считая некоторых дополнительных событий с в мире, экономике и эпидемиологической ситуации). Прошедший год отличается, потому что выглядит как «переломный» в истории C++... и кто знает, куда это заведёт нас.

Давайте вспомним некоторые вещи, случившиеся в прошедшем году.

Читать далее
Всего голосов 51: ↑49 и ↓2 +47
Просмотры 16K
Комментарии 23

SuperIndustry — Dev log #1 – Большой и страшный монстр по имени C++

C++ *Разработка игр *Unreal Engine *

Вступление

Привет, друзья! В этом цикле статей я максимально подробно буду рассказывать о процессе разработки игры на UE – SuperIndustry. Вы сможете на моем примере познать процесс разработки 3D игры на UE. Вкратце про игру: Представьте гибрид Oxygen not included и Satisfactory, в далеком будущем и на специфичной экзо планете. В игре будет глубокий сюжет, который будет повествоваться через своеобразный дневник. Главная цель – улететь с планеты (остановиться на достигнутом) или же продолжить общение с высшим Существом и узнать, что будет дальше.

Предыдущая часть.

Читать далее
Всего голосов 7: ↑5 и ↓2 +3
Просмотры 4.2K
Комментарии 8

Размышление об Active Object в контексте Qt6. Часть 2

C++ *Qt *

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

Читать далее
Всего голосов 3: ↑3 и ↓0 +3
Просмотры 1.4K
Комментарии 2

Меньше точно не бывает! Делаем вольтметр на ATTINY10

C++ *Программирование микроконтроллеров *Разработка под Arduino *Производство и разработка электроники *DIY или Сделай сам
Кейс

В продолжение к прошлой статье решил пощупать и Attiny10. Ну меньше уже точно ничего нет. Если и есть такое извращение с 4 ногами, я о нем не знаю, точнее не нашел.

Тут у нас полноценный МК, в корпусе SOT-23! И задачи на нем решать можно вполне серьезные. Собрав схему на макетке, с МК на адаптере и модулем дисплея я было обрадовался, но готовая плата работать отказалась...

Читать далее
Всего голосов 83: ↑81 и ↓2 +79
Просмотры 11K
Комментарии 74

Истории

Игровое меню SFML C++

C++ *Разработка игр *
Туториал
Recovery mode

Предыдущая тема

Используя графические объекты библиотеки SFML С++, создаём прототип игрового меню. Для практического использования, игровое меню разработано в виде класса GameMenu, который можно подключить к своему проекту через заголовочный файл.

Читать далее
Всего голосов 4: ↑2 и ↓2 0
Просмотры 4.6K
Комментарии 3

Размышление об Active Object в контексте Qt6. Часть 1

C++ *Qt *

На дворе четыре часа ночи. В душе не понимаю, зачем я это пишу, чего я хочу этим добиться, и т.д. Если вкратце, то это будет цикл статей из разряда "хоба, как могу", причём это самое "хоба" зачастую слишком очевидно и элементарно, да и далеко не всегда полезно, особенно, в контексте философии Qt. Так что это будут просто "размышления обо всём".

Читать далее
Всего голосов 11: ↑11 и ↓0 +11
Просмотры 3.4K
Комментарии 0

Происхождение и эволюция аллокатора памяти в С

Анализ и проектирование систем *C++ *Алгоритмы *C *
Туториал

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

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

Читать далее
Всего голосов 102: ↑101 и ↓1 +100
Просмотры 14K
Комментарии 31

Говорящая книга: четверть века спустя

Программирование *C++ *Учебный процесс в IT История IT
Репортаж

Четверть века назад в издательстве Addison-Wesley вышел мой первый CBT (Computer Based Training) - учебник по Visual C++ 5 [1]. 

Это был один из первых в Западной Европе фундаментальных мультимедиальных образовательных проектов. 

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

Читать далее
Всего голосов 25: ↑23 и ↓2 +21
Просмотры 2.3K
Комментарии 1

Современные возможности C++ и проверенные паттерны: активный объект, внешний полиморфизм и корутины

Программирование *C++ *
Туториал

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

Читать далее
Всего голосов 13: ↑12 и ↓1 +11
Просмотры 9.1K
Комментарии 22

Изучение физического движка Bullet

C++ *
Из песочницы

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

Читать далее
Всего голосов 17: ↑17 и ↓0 +17
Просмотры 8.5K
Комментарии 6

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

Работа

QT разработчик
18 вакансий
Программист C++
148 вакансий