Подтвердить что ты не робот

C + + ускорить форвардную декларацию

Я потратил некоторое время на изучение архитектуры библиотек boost:: и был заинтересован в следующем:

В некоторых частях библиотек идея yyy_fwd.hpp используется довольно часто (см. примеры boost/detail или boost/flyweight).

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

Может ли кто-нибудь указать, в каких случаях они помогают, и следует ли использовать ту же идею при разработке моих собственных шаблонов?

Спасибо.

4b9b3361

Ответ 1

Для сокращения зависимостей во время компиляции необходимы передовые декларации. Например, при реализации идиомы Pimpl.

Еще один случай заключается в том, что, например, boost::pool * зависит от windows.h на платформе Windows. При создании моего интерфейса я не хочу принуждать пользователей моего класса включать заголовки системы с помощью моего интерфейса.


* Хорошо, это плохой пример, потому что boost/poolfwd.hpp по-прежнему включает windows.h, но я надеюсь, что они исправит эту проблему. И я надеюсь, что вы поняли эту идею.

Ответ 2

Я не знаю о boost, но эти передовые объявления также существуют в стандартной библиотеке. Например, <iosfwd> содержит форвардные объявления для потоков (которые являются шаблонами, обычно скрытыми за typedefs).

Вы можете извлечь выгоду из этого заголовка при объявлении перегруженного оператора <.

В заголовке:

#include <iosfwd>

class X { ... };

std::ostream& operator<< (std::ostream& os, const X& x);

Обратите внимание, что заголовок не требует полного определения ostream (= basic_ostream<char, char_traits<char> >).

Обоснование заголовка заключается в том, что эти шаблоны громоздки для продвижения вперед. В приведенном выше примере это выглядит примерно так:

namespace std {
    template <class CharT>
    class char_traits;

    template <class CharT, class CharTraits>
    class basic_ostream;

    typedef basic_ostream<char, char_traits<char> > ostream;
}