Недавно добавленные

Абстрактная фабрика предоставляет интерфейс для создания взаимосвязанных объектов, реализующих общее поведение. Один из классических примеров использования: графические элементы для систем Windows и X Window System.

// Интерфейс
class IWidget {
public:
    virtual ~IWidget() {};
    virtual void draw() = 0;
    virtual void display() = 0;
};

// Виджет для Windows
class WindowsWidget : public IWidget {
public:
    virtual void draw();
};

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

Alex Nekipelov, 8 апреля 2012 в 7:31


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

Пример реализации:

Заголовочный файл parser.h

#include <string>
#include <boost/scoped_ptr.hpp>

// Абстрактный интерфейс парсера для разных языков программирования
class IParser {
public:
    virtual

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

Alex Nekipelov, 6 апреля 2012 в 7:1


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

Первый, что приходит в голову

    int result = 0;
    while (x != 0) {
        if( x & 1 )   // Если бит взведен
            result++; // Учитываем его
        x >>= 1;      // Сдвигаем на 1 бит
    }

Таким образом мы проверяем все биты по

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

Alex Nekipelov, 19 марта 2012 в 0:59


Компьютер – это конечный автомат. Потоки нужны тем, кто не умеет программировать конечные автоматы
© Alan Cox.

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

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

Alex Nekipelov, 2 марта 2012 в 4:14


Введение

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

Большой

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

Alex Nekipelov, 29 февраля 2012 в 3:3


Введение

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

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

Alex Nekipelov, 29 февраля 2012 в 3:3


Профайлер – это третий по важности инструмент программиста. Он выполняет сбор статистики во время выполнения работы программы. Одни профайлеры просто выполняют дамп стека во время выполнения, с последующим анализом частоты вызовов. Другие способны, используя специальные функции процессора, отлавливать неправильные предсказания условных переходов, промахов в кеш. Как правило, последним необходимо предварительно выполнить инструментирование кода, первым это не обязательно. Также они различаются влиянием на

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

Alex Nekipelov, 20 января 2012 в 17:44


Отладчик – это второй, по важности, инструмент программиста C++. Он предназначен для отладки кода. Ловит ошибки, возникающие в run-time, позволяет расставлять точки останова, выполнять программу по шагам, изменять переменные (иногда и код) в процессе отладки.

Обычно современные IDE содержат в себе отладчик или предоставляют интерфейс к системному отладчику (в случае Unix систем). В Windows чаще всего используется отладчик, встроенный в Microsoft Visual Studo и WinGDB. В Unix GNU Debugger или

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

Alex Nekipelov, 19 января 2012 в 18:45


Компилятор – это главный инструмент разработчика C++. Наиболее известные представители: Visual C++ для платформы Windows и GNU C++ Compiler для всех остальных платформ. Но существуют и другие, также заслуживающие внимания. При написании программ предпочтительно компилировать их разными компиляторами. Таким образом обеспечивается лучшая проверка и обеспечивается независимость от конкретного компилятора.

Задача компилятора – трансляция исходного кода программы в бинарное представление. Бинарным

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

Alex Nekipelov, 18 января 2012 в 8:26


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

Для начинающего

Основы программирования на С++. Том 1
Essential C++
Автор: Стэнли Б. Липпман
Издательство: Вильямс
Серия: C++ In-Depth
ISBN 5-8459-0349-1; 2002 г.

Язык программирования C++. Вводный курс.
C++ Primer
Автор: Стенли Б. Липпман, Жози Лажойе, Барбара Му

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

Alex Nekipelov, 16 января 2012 в 16:35


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

Оператор стрелка

Оператором стрелка называют —>. Можно увидеть примерно вот с таком коде:

if( a --> b ) {
...
}

На самом деле это два оператора: постфиксный декремент и оператор “больше”

if( a-- > b ) {
...
}

Тернарный оператор

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

0.0.0.0, 15 января 2012 в 9:25


Введение

Как правило, язык C++ используют там, где требуется высокая скорость работы. Но если постараться, на C++ можно написать так, что код будет работать медленнее, чем на любом другом языке. Именно подобным кодом оперируют многочисленные сравнения Any-Lang vs C++. Данные советы предназначены для того, чтобы избегать подобного кода.

Вообще оптимизация бывает трех типов:

  1. Ускорение уже работающего кода.

  2. Изначально написание оптимального кода.

  3. Просто использование оптимальных

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

Alex Nekipelov, 10 января 2012 в 7:8


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

class MyInt {
    ...
    operator int() const;
}

В данном случае тип MyInt, если судить по имени, предназначен для эмуляции встроенного типа int. Поэтому оператор преобразования допустим и возможно полезен. Но если имя и предназначение класса другое, создавать операторы преобразования не следует. Значительно лучше

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

Alex Nekipelov, 9 января 2012 в 7:38


Кому-то может показаться прекрасной идеей перегрузить для своего контейнера оператор & для добавления, а оператор | для удаления элементов. Другой может воспользоваться для этого операторами + и -. Однако почти всегда предпочтительней использовать просто функции: push/pop, add/remove и т.п. Имена функций, в отличии от операторов, более наглядно отображают суть действия. И при обращении к объекту через указатель, его не требуется разыменовывать:

MyStack<int> *ptrStack = &stack;

//

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

0.0.0.0, 9 января 2012 в 6:54


Что предпочтительней: ссылка или указатель?

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

  1. Ссылка – это всего-лишь псевдоним (альтернативное имя). Обращаясь по ссылке мы обращаемся непосредственно к объекту, на который ссылка ссылается. Указатель – это указатель на объект. Т.е. совершенно другой объект, который содержит в себе данные об адресе объекта, на который он ссылается. Поэтому указатель

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

Alex Nekipelov, 9 января 2012 в 6:35


Новичкам в C++ может быть не очевидно, почему не работает вот такой код:

#include <boost/scoped_ptr.hpp>

class TestPimpl;

class Test {
    public:
        Test();

    private:
        boost::scoped_ptr<TestPimpl> pimpl;
};

А причина в том, что компилятор сам создает деструктор, в котором потребуется вызов деструктора TestPimpl. Но TestPimpl в области видимости не присутствует, поэтому вызвать его деструктор не представляется возможным.

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

Alex Nekipelov, 9 января 2012 в 4:45


Популярные страницы

C++/Оптимизация программ на языке C++

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

C++/Профайлеры

C++/Отладчики

Неблокируемые и асинхронные приложения

C++/Что предпочтительней: ссылка или указатель?

C++/Необычный код на C++

У вас есть полезные знания?

Тогда поделитесь ими с другими, добавив статью