Зависит от компоновщика.Некоторые компоновщики ленивы и просто добавляют всю библиотеку. Другая крайность - компоновщики, которые добавляют только необходимый код в исполняемый файл.
Пример теста - написать программу, которая использует puts
, и сравнить с программой, которая использует printf
.Если исполняемые файлы одинакового размера, у вас больше ленивого компоновщика.
Пример:
put_test.cpp
#include <cstdio>
using namespace std;
int main(void)
{
puts("Hello World\n");
return 0;
}
printf_test.cpp
#include <cstdio>
using namespace std;
int main(void)
{
printf("%s\n", "Hello World");
return 0;
}
В приведенном выше примере функция puts
не требует дополнительного кода для разбора строк формата или преобразования чисел в текст.Это базовая линия, потому что она требует минимальной библиотечной функции.
Пример использования printf
требует большей функциональности.Функция printf
требует анализа строки формата и вывода текста.
Ожидаемый результат заключается в том, что исполняемый файл printf
должен быть больше исполняемого файла puts
.Большинство компиляторов будут использовать весь код для функции printf
для разрешения символов (например, для отображения float
s), даже если эта часть кода не используется.Более интеллектуальные (и дорогостоящие) компиляторы нарушают функцию printf
и включают только те части, которые используются или требуются.В приведенном выше примере компилятор должен включать только части для обработки текста и не включать код для форматирования целых чисел и значений с плавающей запятой.
Ленивый компилятор или в режиме отладки скопирует всю библиотеку для примера puts
, таким образом выполняя исполняемые файлы одинакового размера.
Сравнение символов
Платформы * nix и Cygwin предоставляют инструменты для получения символов из исполняемых файлов.Одна из таких утилит - nm
.Запустите nm
для каждого исполняемого файла, направив вывод в текстовый файл.Сравните два текстовых файла.Ленивые компиляторы должны иметь одинаковые символы;кроме их местоположения могут отличаться (что не важно для вопроса).