Избегать встраивания специально созданного кода std :: vector <T>?(Visual Studio C ++ 2008) - PullRequest
5 голосов
/ 24 января 2012

Я хочу уменьшить размер .obj файлов в большом проекте, над которым я работаю (я знаю, что компоновщик удаляет дубликаты определений, но я хочу ускорить процесс сборки). Одна из причин их размера заключается в том, что каждый класс, использующий std::vector<double> или std::vector<std::string>, в конечном итоге компилирует код этого класса и помещает его в свой файл .obj. Я попытался явно создать экземпляр std::vector<double> и использовать объявление extern template, но оно не работает - std::vector в Visual Studio C ++ STL имеет все встроенные методы. Если не считать модификации кода STL (что я не буду делать), есть ли способ заставить компилятор не использовать встроенные экземпляры методов и использовать внешнюю версию std::vector<double>?

Ответы [ 3 ]

2 голосов
/ 24 января 2012

Единственное, что приходит на ум - это написание заголовка включения, который определяет шаблон std::vector (но не его элементы, которые нужно только объявить) и включает его вместо стандартного заголовка vector.

Тогда вы можете явно создать экземпляр std::vector<whatever> в отдельном модуле компиляции и связать его с этим.

Чтобы явно создать экземпляр шаблона, не используйте extern template (это не будет работать), просто используйтеследующее:

#include <vector> // The standard header, not your forward-declaration!

template class std::vector<double>;
1 голос
/ 24 января 2012

То, что я предлагаю сейчас, я бы посчитал хаком , поскольку сворачивает код для достижения оптимизации компилятора .Флаги компилятора должны быть исследованы до того, как вы попробуете это.

В целом то, что компилятор помещает в файлы obj, зависит от компилятора, но я бы предложил попытаться унаследовать специализацию вектора и использовать эту специализацию.Я могу себе представить, что это заставит компилятор создать файл obj, содержащий специализацию вектора, что позволит всем пользователям обернутого вектора использовать его вместо этого.

0 голосов
/ 24 января 2012

Это невозможно, если вы не измените заголовок vector или не предоставите его эквивалент, который содержит только объявления. В противном случае всякий раз, когда вы #include файл vector, его содержимое попадает во включаемый файл и компилируется, а шаблоны создаются при первом использовании. Затем компоновщик устраняет дубликаты. Так работает компиляция C ++, здесь ничего не поделаешь.

...