Эффект включения заголовочного файла в C - PullRequest
3 голосов
/ 27 мая 2011

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

Ответы [ 5 ]

6 голосов
/ 27 мая 2011

Это зависит от того, есть ли определения в заголовочном файле или просто объявлений.

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

Определения, такие как int xyzzy; (или, что еще хуже, char big_honkin_thing[9999999];), могут занимать место в объектном файле и, если у вас нет особо умного компоновщика, также исполняемый файл. Я говорю «может», так как это зависит от реализации.

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

Например, добавление char big[99999] = {'x'}; в заголовочный файл приводит к увеличению размера исполняемого файла от 18 КБ до 118 КБ.

Такие простые объявления, как typedef и extern, не будут выделять пространство в объекте сами по себе.

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

6 голосов
/ 27 мая 2011

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

4 голосов
/ 27 мая 2011

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

Включение файла заголовка, объявления которого никогда не ссылаются в этой единице перевода, не повлияет на размер сгенерированных объектов.Конечно, это замедлит компиляцию.

2 голосов
/ 27 мая 2011

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

0 голосов
/ 29 июля 2014

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

...