Насколько дорого компилятору обрабатывать заголовок с защитой от включения?

Чтобы ускорить компиляцию большого исходного файла, имеет ли смысл сокращать количество заголовков, используемых в модуле перевода, или же затраты на компиляцию кода намного превышают время, необходимое для обработки include-guarded заголовок?

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

Так сколько же времени требуется современному компилятору для обработки заголовка, который эффективно защищен от включения? В какой момент включение таких заголовков станет ударом по производительности компиляции?

(связан с этим вопросом)

3 ответа

Решение

Ответ:

Это может быть очень дорого!

Я нашел статью, в которой кто-то провел некоторое тестирование самой проблемы, о которой идет речь, и с удивлением обнаружил, что вы можете увеличить время компиляции под MSVC по крайней мере на порядок, если вы правильно напишете свои включающие охранники:

http://www.bobarcher.org/software/include/index.html

Самая удивительная черта из результатов заключается в том, что тестовый файл, скомпилированный в соответствии с MSVC 2008, имеет размер от 5,48 до 0,13 с, если правильно включить методологию защиты.

Я прочитал FAQ об этом на днях... во-первых, напишите правильные заголовки, то есть включите все заголовки, которые вы используете, и не зависят от недокументированных зависимостей (которые могут и будут меняться).

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

Заголовочный файл:

// file.hpp

#ifndef H_FILE
#define H_FILE

/* ... */

#endif

Теперь, чтобы использовать заголовок в вашем исходном файле, добавьте дополнительный #ifndef:

// source.cpp

#ifndef H_FILE
#  include <file.hpp>
#endif

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

Предполагая, что C/C++, простая перекомпиляция заголовочных файлов масштабируется нелинейно для большой системы (сотни файлов), поэтому, если производительность компиляции является проблемой, вполне вероятно, что это снизится. По крайней мере, если вы не пытаетесь скомпилировать исходный файл в миллион строк на ПК эпохи 1980-х...

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

Смотрите, например:

http://www.cygnus-software.com/papers/precompiledheaders.html

"Время сборки моего проекта теперь составляет 15% от того, что было раньше!"

Помимо этого, вам нужно взглянуть на методы в:

http://www.amazon.com/exec/obidos/ASIN/0201633620/qid%3D990165010/002-0139320-7720029

Или разделите систему на несколько частей, используя чистые интерфейсы без заголовков, например, компоненты.NET.

Другие вопросы по тегам