Я играю с связыванием на уровне функций в VC ++. Я включил / OPT: REF и / OPT: ICF , и компоновщик рад удалить все неиспользуемые функции. Не так с переменными.
Следующий код предназначен только для демонстрации проблемы, я полностью понимаю, что на самом деле структурирование кода таким образом неоптимально.
//A.cpp
SomeType variable1;
//B.cpp
extern SomeType variable1;
SomeType variable2;
class ClassInB {
//actually uses variable1
};
//C.cpp
extern SomeType variable2;
class ClassInC {
//actually uses variable2;
};
Все эти файлы скомпилированы в статическую библиотеку. Потребительский проект использует только ClassInC
и ссылки на статическую библиотеку. Теперь идет компоновщик VC ++ 9.
Сначала компоновщик видит, что C.obj
ссылается на variable2
и включает B.obj
. B.obj
ссылки variable1
, поэтому он включает A.obj
. Затем начинается фаза устранения несвязанных материалов. Он удаляет все функции в A.obj
и B.obj
, но не переменные. И variable
, и variable2
сохраняются вместе со своими статическими инициализаторами и деинициализаторами. Это приводит к увеличению размера изображения и задержке запуска инициализаторов и деинициализации.
Приведенный выше код упрощен, в реальном коде я действительно не могу легко перейти variable2
в C.cpp
. Я мог бы поместить его в отдельный файл .cpp, но это выглядит очень глупо. Есть ли лучший способ решить проблему с Visual C ++ 9?