2009-12-26 3 views
1

Скажите, что #include и никогда не используйте ничего из stdio.h. Каковы накладные расходы, связанные с этим?Стоимость #include в C

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

ответ

11

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

+0

Иногда сложно включить make compile time серьезно плохо. – sevity

+0

@sevity - Обычно это на C++, где у него может быть много кода и шаблонов и волосатых вещей. C включает в себя реалистично только настолько сложные, и особенно стандартные заголовки, такие как '', не будут бесполезно неэффективными. –

2

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

6

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

4

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

3

Precompiled headers В большинстве популярных компиляторов в настоящее время стоимость включения составляет #include. И во время выполнения ничего не остается, так как компоновщики достаточно умны, чтобы не включать вещи, которые не нужны.

2

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

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

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

3

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

1

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

Для стандартных заголовков C-runtime я не знаю каких-либо значительных затрат времени исполнения. Для других заголовков вам нужно быть осторожными. Некоторые заголовки Windows объявляют сотни UUID, которые могут привести к раздуванию вашего exe.

Как вы узнаете, что это вам что-то стоит во время выполнения, это посмотреть на файл .map, созданный компоновщиком. Есть ли там какие-либо переменные или функции, которых вы не ожидали?

+0

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

+0

@Chris - Я бы хотел, чтобы это было правдой. Но «используемый» означает что-то другое для людей, чем для линкеров. линкеры не могут действительно отличить это от «ссылки». для заголовочных файлов тривиально иметь ссылки, которые вы действительно не используете ' , поместите 'extern int _foobar;' в заголовок и посмотрите, что произойдет. –