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

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

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

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

(относится к этому вопросу )

Ответы [ 3 ]

1 голос
/ 14 июля 2011

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

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

См. Например:

http://www.cygnus -software.com / документы / precompiledheaders.html

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

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

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

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

1 голос
/ 14 июля 2011

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

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

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

// file.hpp

#ifndef H_FILE
#define H_FILE

/* ... */

#endif

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

// source.cpp

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

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

0 голосов
/ 14 июля 2011

Ответ:

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...