#include влияет на размер программы?

Когда мой cpp файл использует #include для добавления некоторого заголовка, делает размер моей заключительной программы, становится больше? Заголовок не рассматривают как единицы компиляции, но содержание заголовочного файла добавляется к фактическому исходному файлу препроцессором, так будет размер выходного файла (или exe или dll) быть затронутым этим?

Править: Я забыл упоминать, что вопрос не о шаблонах/подставляемых функциях. Я имел в виду то, что произойдет, если я помещу #include к заголовку, который не имеет никакой детали реализации функций.Спасибо.

5
задан Meraj al Maksud 4 December 2019 в 04:16
поделиться

8 ответов

Вы уточнили, что:

[Заголовок не содержит] шаблонов / встроенных функций ... не содержит деталей реализации функций.

Вообще говоря, нет, добавление файла заголовка не повлияет на размер программы.

Вы можете это проверить. Возьмите программу, которая уже построена, и проверьте размер исполняемого файла. Затем перейдите в каждый файл .cpp и включите стандартный файл заголовка C или C ++, который на самом деле не нужен в этом файле. Скомпилируйте программу и снова проверьте размер исполняемого файла - он должен быть того же размера, что и раньше.

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

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

Однако, безусловно, есть исключения. Вот несколько.

Один из них - если у вас простой компоновщик. Затем, если вы добавите файл заголовка, который генерирует вещи, которые на самом деле не нужны программе, и компоновщик не выбрасывает их, размер исполняемого файла увеличится. (Некоторые люди намеренно создают компоновщики таким образом, потому что время компоновки может стать безумно быстрым.)

Часто добавление файла заголовка, который добавляет или изменяет определение символа препроцессора, изменяет то, что генерирует компилятор. Например, assert.h (или cassert) определяет макрос assert (). Если вы включите файл заголовка в .c /. cpp, который изменяет определение символа препроцессора NDEBUG, он изменит, генерирует ли использование assert () какой-либо код, и, таким образом, изменит размер исполняемого файла.

Кроме того, добавление файла заголовка, который изменяет параметры компилятора, изменит размер исполняемого файла. Например, многие компиляторы позволяют изменять стандартную «упаковку» структур с помощью строки вроде #pragma pack . Поэтому, если вы добавите файл заголовка, который изменяет упаковку структуры в файле .c / .cpp, компилятор сгенерирует другой код для работы со структурами и, следовательно, изменит размер исполняемого файла.

И, как заметил кто-то другой, когда вы мы имеем дело с Visual C ++ / Visual Studio, все ставки сняты. У Microsoft, можно сказать, уникальный взгляд на свои инструменты разработки, который не разделяют люди, пишущие компиляторные системы для других платформ.

7
ответ дан 18 December 2019 в 08:29
поделиться

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

Однако я бы не стал на это рассчитывать. Я знаю, что еще в VC ++ 6 дней мы обнаружили, что простой #including Windows.h добавил 64 КБ к исполняемому файлу для каждого исходного файла, который это сделал.

11
ответ дан 18 December 2019 в 08:29
поделиться

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

1
ответ дан 18 December 2019 в 08:29
поделиться

И вы также можете определять глобальные переменные в файлах заголовков (хотя я бы не рекомендовал это). Если вы это сделаете, вы должны окружить их конечными блоками # ifdef / #, чтобы они не определялись более чем в одном модуле компиляции (иначе компоновщик пожаловался бы). В любом случае это увеличило бы размер программы.

0
ответ дан 18 December 2019 в 08:29
поделиться

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

0
ответ дан 18 December 2019 в 08:29
поделиться

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

0
ответ дан 18 December 2019 в 08:29
поделиться

Для заголовков, которые являются полностью декларативными (как правило, они должны быть), нет. Однако препроцессору и компилятору нужно время, чтобы проанализировать заголовки, поэтому заголовки могут увеличить время компиляции; особенно большие и глубоко вложенные, такие как - вот почему некоторые компиляторы используют «предварительно скомпилированные заголовки».

Даже встроенный и шаблонный код не увеличивает размер кода напрямую. Если шаблон никогда не создается или встроенная функция не вызывается, код не создается. Однако, если он вызывается / создается, размер кода может быстро расти. Если компилятор действительно встраивает код (компилятор не обязан это делать, и большинство из них этого не делают, если его не заставляют), дублирование кода может быть значительным. Даже если он не встроен компилятором, он по-прежнему создается статически в каждом объектном модуле , который ссылается на него - для удаления дубликатов требуется умный компоновщик, и это не дано - если отдельные объектные файлы были скомпилированы с разными параметрами, встроенный код из того же source может не генерировать идентичный код в каждом объектном файле, поэтому не будет даже дублироваться. В случае шаблонов для каждого типа будет создан отдельный экземпляр.

0
ответ дан 18 December 2019 в 08:29
поделиться

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

0
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: