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