Подтвердить что ты не робот

Использует ли использование неназванных пространств имен время ссылки?

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

  • Можно ли предположить, что если я уменьшу количество символов с внешней связью, мое время ссылки будет уменьшено?
  • Если да, то помещает ли сущности (например, классы и функции), которые используются только в одном TU в неназванные пространства имен, что-нибудь мне полезно? Технически объекты с внешней связью сохраняют свою внешнюю связь в неназванном пространстве имен, но, как отмечает стандарт С++ 11,

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

Выполняют ли алгоритмы компоновщика оптимизацию, основанную на знании того, что сущности с внешней связью в неназванных пространствах имен не видны за пределами их пространств имен?

4b9b3361

Ответ 1

Да, я думаю, это сокращение времени ссылки. Я думаю, что это на Chrome Chrome: "Пространства имен имен ограничивают эти символы единиц компиляции, улучшая стоимость вызова функций и уменьшая размер таблиц точек входа". Здесь ссылка

Я знаю, что это касается проекта chromium, но он должен применяться к другим проектам С++.

Ответ 2

Я не вижу, как компоновщик мог бы делать такую ​​оптимизацию, потому что к моменту, когда линкер захватывает символ (ы), о котором идет речь, они выглядят как обычные декорированные символы внешней связи. Если компоновщик не имеет конкретной информации о том, как компилятор украшает имена в анонимном пространстве имен, я не вижу возможности оптимизировать его работу.

Вы подтвердили, что ваш компоновщик на самом деле связан с ЦП и не связан с I/O? Если он не связан с ЦП, он, вероятно, не поможет реорганизовать ваш код.