Ответ пользователя в траншеях заключается в том, что имена в безымянных пространствах имен (термин стандарта для анонимных пространств имен) имеют external связь, а имена, объявленные static
на уровне пространства имен, имеют internal связь.
Внутренняя связь имеет два преимущества, только одно из которых предоставляют безымянные пространства имен:
Они делают имена локальными для единицы перевода. Я могу по-разному определять одну и ту же функцию fun
в разных единицах перевода, не нарушая Правило одного определения. Это свойство совместно используется именами в безымянном пространстве имен, украсив их уникальным именем пространства имен.
Они не позволяют имени войти в глобальную таблицу символов. Это строго оптимизация, но важная на практике. Это свойство не используется совместно именами в безымянном пространстве имен.
Так, в общем, программа, которая использует static
для своих функций уровня пространства имен локального блока перевода, генерирует меньше работы для компоновщика и может выполняться быстрее, чем эквивалентная программа, использующая пространство имен без имени.
При этом вам нужно использовать безымянное пространство имен для типов, которые вы хотите передать в качестве аргументов шаблона, потому что аргументы шаблона должны иметь внешнюю связь.
Поэтому я обычно делаю следующее: определяю свободные функции как static
, но помещаю типы в безымянное пространство имен.