Я задал себе следующий вопрос, когда я обсуждал тему this.Мусор из других связующих единиц
Существуют ли случаи, когда какой-либо неиспользуемый код из единиц перевода связывается с окончательным исполняемым кодом (в режиме разблокировки, конечно) для популярных компиляторов, таких как GCC и VC++?
Например предположим, у нас есть 2 единицы компиляции:
//A.hpp
//Here are declarations of some classes, functions, extern variables etc.
и исходный файл
//A.cpp
//defination of A.hpp declarations
И, наконец, основные
//main.cpp
//including A.hpp library
#include "A.hpp"
//here we will use some stuff from A.hpp library, but not everything
Мой вопрос. Что делать, если в main.cpp используется не весь материал из A.hpp? Удаляет ли компоновщик весь неиспользуемый код или есть некоторые случаи, когда какой-то неиспользуемый код может связываться с исполняемым файлом?
Редактировать: Меня интересуют линкеры G ++ и VC++.
Редактировать: Конечно, я имею в виду в режиме выпуска.
Редактировать: Я начинаю благодарность за этот вопрос, чтобы получить хороший и полный ответ. Я ожидаю ответа, который объяснит, в каких случаях ссылки g ++ и VC++ связывают мусор и какой код они могут удалить из исполняемого файла (ненужные функции, ненужные глобальные переменные, ненужные определения классов и т. Д.) И почему они не могут удалить какой-то ненужный материал.
Укажите, пожалуйста, компилятор. – leppie
Для GCC выполните поиск SO для '-gc-sections'. Я уже ответил на этот вопрос. Я думаю, что это называется привязкой на уровне функций для VC++. – leppie
@leppie Я искал в Интернете ссылку на функциональный уровень. Хорошо, это частично ответ, но как насчет классов, внешних переменных и т. Д.? Удалят ли они из исполняемого файла или нет? А также есть что-то подобное для gcc? – UmmaGumma