Использует ли использование неназванных пространств имен время ссылки?
Предположим, что у меня есть большая система со многими объектными файлами, так что время ссылки является проблемой. Предположим также, что я знаю, что многие из классов и функций в моей системе не используются вне их единицы перевода.
- Можно ли предположить, что если я уменьшу количество символов с внешней связью, мое время ссылки будет уменьшено?
- Если да, то помещает ли сущности (например, классы и функции), которые используются только в одном TU в неназванные пространства имен, что-нибудь мне полезно? Технически объекты с внешней связью сохраняют свою внешнюю связь в неназванном пространстве имен, но, как отмечает стандарт С++ 11,
Хотя объекты в неназванном пространстве имен могут иметь внешнюю связь, они эффективно квалифицируются по имени, уникальному для их единицы перевода, и поэтому никогда не могут быть замечены из любой другой единицы перевода.
Выполняют ли алгоритмы компоновщика оптимизацию, основанную на знании того, что сущности с внешней связью в неназванных пространствах имен не видны за пределами их пространств имен?
Ответы
Ответ 1
Да, я думаю, это сокращение времени ссылки. Я думаю, что это на Chrome Chrome:
"Пространства имен имен ограничивают эти символы единиц компиляции, улучшая стоимость вызова функций и уменьшая размер таблиц точек входа". Здесь ссылка
Я знаю, что это касается проекта chromium, но он должен применяться к другим проектам С++.
Ответ 2
Я не вижу, как компоновщик мог бы делать такую оптимизацию, потому что к моменту, когда линкер захватывает символ (ы), о котором идет речь, они выглядят как обычные декорированные символы внешней связи. Если компоновщик не имеет конкретной информации о том, как компилятор украшает имена в анонимном пространстве имен, я не вижу возможности оптимизировать его работу.
Вы подтвердили, что ваш компоновщик на самом деле связан с ЦП и не связан с I/O? Если он не связан с ЦП, он, вероятно, не поможет реорганизовать ваш код.