Определите вклад включенных заголовочных файлов в общий размер файла - PullRequest
1 голос
/ 16 декабря 2009

Я заинтересован в уменьшении размера файла моего приложения. Это приложение MFC / C ++, созданное с помощью MVC ++ в Visual Studio 2008. UPX хорошо справляется с сокращением конечного исполняемого файла примерно до 40% от его исходного размера, но я бы хотел уменьшить его еще больше.

MFC должен быть статически связан в этом проекте.

Я пробовал некоторые методы, описанные в этом вопросе: Reduce-Windows-Executable-size . В частности применение различных настроек к компилятору / компоновщику.

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

Любой совет, как это сделать, может быть, инструмент, который может анализировать мой код для меня? Спасибо

Ответы [ 5 ]

8 голосов
/ 16 декабря 2009

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

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

Заголовки обычно содержат только:

  1. Макросы
  2. Определения типов (например, классы)
  3. Объявление функции вперед (определение функции находится в файле .c / .cpp)

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

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

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

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

Например, предположим код для std::list<T>::size. Он может использоваться во многих единицах перевода. Тем не менее, компоновщик будет складывать много копий вместе, иногда даже для разных типов T. Но как бы вы учитывали результирующие байты в выполнимом?

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

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

Единственный способ уменьшить размер проекта - это уменьшить объем кода. Как сказал Нил, удаление заголовков только сократит время сборки. Компиляторы не будут включать все при выполнении предложения «using namespace», они будут выбирать только то, что необходимо. Теперь, с другой стороны, если вы добавляете заголовки к вещам, которые вообще нигде не используются в проекте, это хорошее указание на класс, который должен быть удален.

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

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

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

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

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