Как запретить компоновщику VC ++ 9 связывать ненужные глобальные переменные? - PullRequest
3 голосов
/ 03 марта 2010

Я играю с связыванием на уровне функций в 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?

1 Ответ

2 голосов
/ 04 марта 2010

MSDN (см. Раздел Arguments, REF | NOREF аргументы, 4-й абзац) указывает, что You have to explicitly mark data as a COMDAT; use __declspec(selectany). для компоновщика для удаления указанных неиспользуемых данных при использовании /OPT:REF.

Вы пробовали и имели какой-нибудь шанс с __declspec (selectany) ?

...