Стоимость # вкл в С - PullRequest
       43

Стоимость # вкл в С

1 голос
/ 26 декабря 2009

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

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

Ответы [ 8 ]

11 голосов
/ 26 декабря 2009

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

6 голосов
/ 26 декабря 2009

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

4 голосов
/ 26 декабря 2009

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

3 голосов
/ 26 декабря 2009

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

3 голосов
/ 26 декабря 2009

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

2 голосов
/ 26 декабря 2009

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

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

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

2 голосов
/ 26 декабря 2009

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

1 голос
/ 26 декабря 2009

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

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

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

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