26 апреля 2008

Speeding up compilation

Компиляция C++ проектов - вещь довольно затратная по времени. Что можно предпринять для ускорения? Мои советы такие:

1. Разбивайте проект на отдельно компилируемые файлы - тогда при изменении одного фрагмента системы перекомпилируется только этот файл. Тут, правда, палка о двух концах - возрастет время rebuild-а, но полный ребилд делается обычно реже чем фазы "немного поправил - скомпилировал".

2. Включайте (#include) только самое необходимое. Иногда достаточно включить some_forward.h или some_feature1.h вместо большого some.h. Для использовании ссылки или указателя на класс компилятору не нужно знать все о классе - пользуйтесь этим при написании header-файлов:
//вместо #include "SomeClass.h"
class SomeClass;

void Foo(SomeClass&);
void Bar(SomeClass*);
А шаблоны вообще раскрываются в момент использования, а не декларации.

3. Распараллеливайте компиляцию на несколько процессоров.

4. Тривиально: поставьте побольше оперативной памяти.

5. Во время компиляции запустите system monitor и убедитесь, что не только процессор и память имеют значение. Узкое место: жесткий диск. Поставьте два три четыре быстрых диска в RAID0. Я серьезно.

20 апреля 2008

Linkdumps from DOU

На developers.com.ua еженедельно раздают замечательные подборки ссылок. Можно подписаться через общий rss, а можно отфильтровать по слову "linkdump".

06 апреля 2008

Accessing old-school APIs as C++ containers

Часто API и библиотеки предоставляют доступ к набору объектов в следующем виде:
size_t GetItemCount();
value GetItem(size_t Index);
Особенно это относится к библиотекам на C. Оказалось, очень просто преобразовать такой интерфейс к более стандартному для C++ виду - итераторам:
class iterator : public boost::iterator_facade<iterator, value,
std::random_access_iterator_tag, value, size_t>
{
public:
iterator(size_t Index) : Index_(Index) { }

// implementation
public:
reference dereference() const { return GetItem(Index_); }
void increment() { ++Index_; }
void decrement() { --Index_; }
bool equal(const iterator& It) const { return Index_ == It.Index_; }

private:
size_t Index_;
};
Теперь можно делать STL-way:
std::copy(iterator(0), iterator(GetItemCount()), ...);
Или даже так:
BOOST_FOREACH(value v, make_iterator_range(iterator(0), iterator(GetItemCount())))
...;