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