Влияет ли #include на размер программы? - PullRequest
4 голосов
/ 08 октября 2009

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

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

Ответы [ 8 ]

10 голосов
/ 08 октября 2009

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

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

6 голосов
/ 08 октября 2009

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

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

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

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

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

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

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

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

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

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

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

1 голос
/ 08 октября 2009

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

0 голосов
/ 09 октября 2009

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

0 голосов
/ 09 октября 2009

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

0 голосов
/ 09 октября 2009

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

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

0 голосов
/ 08 октября 2009

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

0 голосов
/ 08 октября 2009

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

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