Здесь вы смешиваете две разные проблемы:
- Заголовочные файлы, обрабатываемые препроцессором
- Выборочное связывание кода компоновщиком C ++
Заголовочные файлы
Они просто дословно копируются препроцессором в место, которое include
их. Весь код algorithm
копируется в файл .cpp
, когда вы #include <algorithm>
.
Выборочное связывание
Большинство современных компоновщиков не будут ссылаться на функции, которые не вызываются в вашем приложении. То есть написать функцию foo
и никогда не вызывать ее - ее код не попадет в исполняемый файл. Так что если вы #include <algorithm>
и используете только sort
, вот что произойдет:
- Препроцессор помещает весь файл
algorithm
в ваш исходный файл
- Вы звоните только
sort
- Связанный анализирует это и добавляет только источник
sort
(и вызываемые им функции, если таковые имеются) в исполняемый файл. Код других алгоритмов не добавляется
Тем не менее, шаблоны C ++ еще более усложняют ситуацию. Это сложная проблема, которую нужно объяснить здесь, но в двух словах: шаблоны расширяются компилятором для всех типов, которые вы фактически используете. Поэтому, если vector
равно int
и vector
равно string
, компилятор сгенерирует две копии всего кода для класса vector
в вашем коде. Поскольку вы используете его (иначе компилятор не сгенерирует его), компоновщик также помещает его в исполняемый файл.