Tagged with cpp
Недавно, благодаря хорошей идее на KDE Brainstorm я создал плагин для KDE Plasma Runner, позволяющий быстро добавлять задачи и события в календарь, исходный код которого доступен на GitHub.
Сегодня я хотел бы поделиться опытом создания, а конкретно рассмотреть тему написания приложений, использующих Akonadi.
В качестве примера я рассмотрю простое консольное приложение, которое позволяет добавлять задачи в календарь. Почему консольное приложение? Во-первых, чтобы не отвлекаться на аспекты, не имеющие прямого отношения к Akonadi. Во-вторых, чтобы
Читать дальше »
Как часто Вам приходилось хранить в стандартных STL контейнерах указатели на объекты? Я думаю, достаточно. Но хранение обычных указателей приводит к тому, что приходится тратить дополнительные усилия на то, чтобы проверять, что память освобождается при уничтожении контейнера.
Обычное решение этой проблемы - умные указатели с подсчетом ссылок, обеспечивающие автоматическое освобождение памяти. Однако, достаточно часто встречаются случаи, когда их использование избыточно, например, когда объекты имеют всего одного владельца и подсчет ссылок, вообще говоря не нужен.
А судя по замерам, накладные расходы по производительности и памяти на подсчет ссылок достаточно велики: Boost smart pointer timings.
Что же делать в таких случаях? На помощь приходит очередная библиотека в составе Boost - Pointer Container Library. Она предоставляет основные контейнеры, схожие со стандартными, специально предназнченные для хранения указателей.
Читать дальше »
В этой заметке я продолжу рассказывать о библиотеке Boost::Spirit, предназначенной для написания на C++ различных парсеров. В прошлой заметке я описал базовые возможности Spirit, a в этой хочу затронуть несколько возможностей, которые по моему мнению практически необходимы в случае написания сколько-нибудь сложных парсеров. Итак, эти возможности:
Читать дальше »
Не так давно я писал об использовании библиотеки Boost::Regex для регулярных выражений в C++. В этой заметке, я опять затрону эту тему, только теперь рассмотрю другой компонент Boost, предназначенный для обработки регулярных выражений: Boost::Xpresive.
Итак, во-первых, чем же он отличается от Boost::Regex:
- Xpressive не требует линковки никаких дополнительных библиотек;
- Утверждается, что Xpressive в среднем работает быстрее;
- В Xpressive реглярные выражения могут описываться не только динамически (в виде строки, передаваемой в некую функцию), но и статически в виде C++ кода.
- Регулярные выражения Xpressive могут ссылаться друг на друга, образуя целые грамматики
Читать дальше »
В этой заметке я рассмотрю такую достаточно популярную тему, как использование регулярных выражений. Причем, рассматривать я буду применительно к C++ с использованием библиотеки Boost, которая содержит замечательные средства для их поддержки.
Используемый синтаксис реглярных выражений совпадает с широко известным PCRE (Perl-Compatible Regular Expressions).
Для использования библиотеки необходимо включить заголовочный файл boost/regex.hpp:
#include <boost/regex.hpp>
Читать дальше »
Иногда в проектах на C++, (у кого-то чаще, у кого-то реже) возникает задача разбора какого-либо структурированного текста. То есть по сути, создание парсера того или иного языка. Обычно, к этой задаче подходят одним из следующих способов:
- Написание парсера вручную, анализируя строку средствами C++, возможно, используя регулярные выражения.
- Генерация парсера с использованием соответствующих утилит, например, Antlr, lex/yacc и т.п.
Несколько иной подход предоставляется библиотекой Spirit в составе Boost. О нем я расскажу ниже.
Boost::Spirit – библиотека, предназначенная для описания текста грамматики вместе с семантическими действиями прямо в C++ коде. Грамматика буквально конструируется из примитивных парсеров путем использования соответствующим образом перегруженных операторов C++. Таким образом, описание грамматики выглядит достаточно близко к классическому описанию, как например БНФ.
Читать дальше »
Недавно я написал свой первый апплет для KDE4, в связи с чем хочу поделиться опытом разработки.
Итак, мой апплет: Plasma One-Line Calculator. Крайне простая и вместе с тем необходимая мне вещь. Работает он следующим образом: на рабочем столе отображается текстовое поле, в которое можно ввести выражение. При нажатии Enter это выражение вычисляется и в поле отображается результат вычисления. Вот и все.
Для того, чтобы реализовать вычисление, я использовал возможности скриптового движка в KDE4.
Исходный код
Исходный код плагина состоит из трех файлов:
Читать дальше »
Тема поста навеяна недавними постами на www.codeblogz.ru и в журнале Benoît Jacob. Benoît Jacob заявляет, что использование виртуальных функций приводит к трехкратным издержкам по производительности и предлагает технику, позволяющую избавиться от виртуальных функций, за счет использования шаблонов. Здесь я изложу некоторые свои соображения по этому вопросу.
Читать дальше »
На тему http://dask-blog.blogspot.com/2008/05/property-c.html.
Немного поигравшись, пришел к реализации свойств в C++, которая обладает некоторыми преимуществами, по сравнению с известными мне реализациями:
- Свойства не требуют инициализации в конструкторах
- Независимо от количества свойств, размер класса увеличивается на константу, связанную с выравниваем членов. У меня, например, на 4 байта.
Как это делается?
Читать дальше »
Умные указатели (Smart pointers) - это, объекты, которые хранят указатели на динамическую память. Они действуют аналогично обычным указателям C++, за исключением того, что автоматически освобождают память в необходимый момент.
Boost предоставляет шесть типов умных указателей:
- scoped_ptr - некопируемый автоматический указатель на объект;
- scoped_array - некопируемый автоматический указатель на массив;
- shared_ptr - разделяемый указатель на объект;
- shared_array - разделяемый указатель на массив;
- weak_ptr - вариант разделяемого указателя, не увеличивающий счетчик ссылок;
- intrusive_ptr - указатель со встроенным в объект счетчик ссылок
Читать дальше »
Контейнеры STL построены на концепции, состоящей в том, что каждый контейнер контролирует свой собственный набор элементов, предоставляя какой-либо интерфейс доступа к ним.
В отличие от STL, контейнеры boost::multi_index построены на другом принципе: каждый контейнер содержит хранилище элементов, предоставляя несколько различных интерфейсов доступа ( называемых в boost индексами ) к ним. Такой подход позволяет достаточно легко и прозрачно строить контейнеры совмещающие свойства различных STL контейнеров, а также быстро менять описание контейнера в случае необходимости добавления или удаления индексов, не меняя уже написанный код, работающий с контейнером.
Читать дальше »