Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Исключается ли код неиспользуемых функций при подключении библиотек?

#cpp #c


Вопрос насчет теории языков с/с++. Например, если я подключаю математические функции
через #include , и использую только одну какую-нибудь функцию (допустим, sin),
то бинарный файл итоговой программы будет содержать все функции из  или только
одну функцию sin?
    


Ответы

Ответ 1



Если у вас имеется несколько модулей (объектных файлов), то для получения итогового исполнимого файла их нужно объединить. Такой задачей занимается компоновщик. Правила работы компоновщика не описаны в стандартах языков C или C++. Но элементарная проверка может ответить на ваш вопрос применимо к конкретному компоновщику. Рассмотрим следующий код: #include int main() { typedef double (*F)(double); F f[] = {sin, cos}; } Я проверил результат сборки с помощью QtCreator и MinGW 5.6.2 32bit на Windows 7 со включенной отладочной информацией. Получил такие результаты: F f[] = {sin, cos}; // 50 031 байт F f[] = {sin, sin}; // 49 546 байт F f[] = {sin, 0}; // 49 546 байт F f[] = {0, 0}; // 48 373 байт Можно видеть, что уменьшение кол-ва разных функций приводит к снижению размера итогового исполняемого файла. Т.е. линкер выкинул явно неиспользованные функции из объектного файла. В некоторых случаях, чтобы исключение неиспользуемого кода из библиотек было более эффективным, библиотека должна быть собрана с указанием специфических ключей. Например, для Visual C++ таким ключом является /Gy. Он обеспечивает упаковку функций, необходимую компоновщику для достижения желаемого эффекта. Без данного ключа, компоновщик оперирует модулями (объектными файлами), а не функциями внутри библиотеки.

Ответ 2



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

Комментариев нет:

Отправить комментарий