Страницы

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

пятница, 2 ноября 2018 г.

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

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


Ответ

Если у вас имеется несколько модулей (объектных файлов), то для получения итогового исполнимого файла их нужно объединить. Такой задачей занимается компоновщик. Правила работы компоновщика не описаны в стандартах языков 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. Он обеспечивает упаковку функций, необходимую компоновщику для достижения желаемого эффекта. Без данного ключа, компоновщик оперирует модулями (объектными файлами), а не функциями внутри библиотеки.

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

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