Компилирует ли CMake все включенные заголовки в исполняемый файл или только те части, которые используются в основном классе? - PullRequest
0 голосов
/ 28 декабря 2018

Я пишу программу на C, в которой важен каждый бит размера исполняемого файла.

Если, например, в моей программе требуется только printf () из stdlib.h, то включение заголовка действительно вызоветвсе в этой библиотеке для копирования в скомпилированный исполняемый файл CMake?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

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

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

0 голосов
/ 28 декабря 2018

CMake - это просто генератор системы сборки.Что в конечном итоге входит в окончательный исполняемый файл, решается компоновщиком и какими опциями вы пользуетесь.Типичные компоновщики будут связывать в исполняемый файл только то, что они могут определить как необходимые - если вы не попросите их связать все.Однако есть некоторые ограничения на то, насколько они могут уменьшить занимаемую площадь.

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

Какие используемые вами заголовки не имеют никакого эффекта, поскольку заголовки обрабатываются во время компиляции, а не во время компоновки.

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

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