C++/Паттерн/Абстрактная фабрика
Абстрактная фабрика предоставляет интерфейс для создания взаимосвязанных объектов, реализующих общее поведение. Один из классических примеров использования: графические элементы для систем 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
C++/Паттерн/Виртуальный конструктор
Паттерн проектирования виртуальный конструктор (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
C++/Статические анализаторы
Введение
Статические анализаторы предназначены для анализа кода на предмет наличия ошибок. В отличии от динамических анализаторов, анализ выполняется без выполнения самой программы и охватывает весь анализируемый код, в том числе и редко используемый. В какой-то мере современные компиляторы осуществляют статический анализ. Но специализированные инструменты, как правило, находят значительно большее количество проблем, на которые компиляторы внимания не обращают.
Большой
Alex Nekipelov, 29 февраля 2012 в 3:3
C++/Динамические анализаторы
Введение
Динамические анализаторы, как и статические анализаторы, предназначены для поиска ошибок в программах. Отличие в том, что динамические анализаторы, как правило, выполняют предварительное инструментирование, самостоятельно выполняют машинный код или проверки встраиваются на этапе компиляции. За счет этого не бывает ложных срабатываний, но и проверке подвергается только та часть кода, которая была выполнена. Т.е. если в программе имеется код, выполняемый только в
Alex Nekipelov, 29 февраля 2012 в 3:3
C++/Профайлеры
Профайлер – это третий по важности инструмент программиста. Он выполняет сбор статистики во время выполнения работы программы. Одни профайлеры просто выполняют дамп стека во время выполнения, с последующим анализом частоты вызовов. Другие способны, используя специальные функции процессора, отлавливать неправильные предсказания условных переходов, промахов в кеш. Как правило, последним необходимо предварительно выполнить инструментирование кода, первым это не обязательно. Также они различаются влиянием на
Alex Nekipelov, 20 января 2012 в 17:44
C++/Отладчики
Отладчик – это второй, по важности, инструмент программиста C++. Он предназначен для отладки кода. Ловит ошибки, возникающие в run-time, позволяет расставлять точки останова, выполнять программу по шагам, изменять переменные (иногда и код) в процессе отладки.
Обычно современные IDE содержат в себе отладчик или предоставляют интерфейс к системному отладчику (в случае Unix систем). В Windows чаще всего используется отладчик, встроенный в Microsoft Visual Studo и WinGDB. В Unix GNU Debugger или
Alex Nekipelov, 19 января 2012 в 18:45
C++/Компиляторы
Компилятор – это главный инструмент разработчика C++. Наиболее известные представители: Visual C++ для платформы Windows и GNU C++ Compiler для всех остальных платформ. Но существуют и другие, также заслуживающие внимания. При написании программ предпочтительно компилировать их разными компиляторами. Таким образом обеспечивается лучшая проверка и обеспечивается независимость от конкретного компилятора.
Задача компилятора – трансляция исходного кода программы в бинарное представление. Бинарным
Alex Nekipelov, 18 января 2012 в 8:26
C++/Книги
Подборка наиболее полезных книг для разработчика на языке программирования C++. К сожалению затронуты не все области, поэтому если вы знаете другие полезные книги, пожалуйста, сообщите о них.
Для начинающего
Основы программирования на С++. Том 1
Essential C++
Автор: Стэнли Б. Липпман
Издательство: Вильямс
Серия: C++ In-Depth
ISBN 5-8459-0349-1; 2002 г.
Язык программирования C++. Вводный курс.
C++ Primer
Автор: Стенли Б. Липпман, Жози Лажойе, Барбара Му
Alex Nekipelov, 16 января 2012 в 16:35
C++/Необычный код на C++
Не все читают стандарт языка C++ и тем более понят его. Статья описывает некоторые вещи, которые не описываются в книгах для начинающих. Конечно же не все это следует применять на практике, некоторые конструкции просто желательно знать.
Оператор стрелка
Оператором стрелка называют —>. Можно увидеть примерно вот с таком коде:
if( a --> b ) {
...
}
На самом деле это два оператора: постфиксный декремент и оператор “больше”
if( a-- > b ) {
...
}
Тернарный оператор
0.0.0.0, 15 января 2012 в 9:25
C++/Оптимизация программ на языке C++
Введение
Как правило, язык C++ используют там, где требуется высокая скорость работы. Но если постараться, на C++ можно написать так, что код будет работать медленнее, чем на любом другом языке. Именно подобным кодом оперируют многочисленные сравнения Any-Lang vs C++. Данные советы предназначены для того, чтобы избегать подобного кода.
Вообще оптимизация бывает трех типов:
Ускорение уже работающего кода.
Изначально написание оптимального кода.
Просто использование оптимальных
Alex Nekipelov, 10 января 2012 в 7:8
C++/Не злоупотребляйте операторами преобразования типов
Использование операторов преобразования типов частенько может приводить к потенциально ошибочному коду. Расписывая принципы ООП, в книжках часто приводят примерно такой код:
class MyInt {
...
operator int() const;
}
В данном случае тип MyInt, если судить по имени, предназначен для эмуляции встроенного типа int. Поэтому оператор преобразования допустим и возможно полезен. Но если имя и предназначение класса другое, создавать операторы преобразования не следует. Значительно лучше
Alex Nekipelov, 9 января 2012 в 7:38
C++/Не злоупотребляйте перегрузкой операторов
Кому-то может показаться прекрасной идеей перегрузить для своего контейнера оператор & для добавления, а оператор | для удаления элементов. Другой может воспользоваться для этого операторами + и -. Однако почти всегда предпочтительней использовать просто функции: push/pop, add/remove и т.п. Имена функций, в отличии от операторов, более наглядно отображают суть действия. И при обращении к объекту через указатель, его не требуется разыменовывать:
MyStack<int> *ptrStack = &stack;
//
0.0.0.0, 9 января 2012 в 6:54
C++/Что предпочтительней: ссылка или указатель?
Что предпочтительней: ссылка или указатель?
С одной стороны, ссылки и указатели похожи: оба средства позволяют косвенно обратиться к другому объекту. Но различия между ними достаточно большие.
- Ссылка – это всего-лишь псевдоним (альтернативное имя). Обращаясь по ссылке мы обращаемся непосредственно к объекту, на который ссылка ссылается. Указатель – это указатель на объект. Т.е. совершенно другой объект, который содержит в себе данные об адресе объекта, на который он ссылается. Поэтому указатель
Alex Nekipelov, 9 января 2012 в 6:35
C++/Использование идиомы pimpl совместно с умными указателями
Новичкам в 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