Безымянные пространства имен - это утилита, позволяющая сделать единицу перевода идентификатора локальной. Они ведут себя так, как будто вы выбираете уникальное имя для каждой единицы перевода для пространства имен:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
Дополнительный шаг с использованием пустого тела важен, поэтому вы уже можете ссылаться в теле пространства имен на идентификаторы, подобные ::name
тем, которые определены в этом пространстве имен, поскольку директива using уже имела место.
Это означает, что вы можете вызывать бесплатные функции (например), help
которые могут существовать в нескольких единицах перевода, и они не будут конфликтовать во время ссылки. Эффект почти идентичен использованию static
ключевого слова, используемого в C, которое вы можете вставить в объявление идентификаторов. Неназванные пространства имен - превосходная альтернатива, позволяющая даже сделать единицу перевода типа локальной.
namespace { int a1; }
static int a2;
Оба a
являются локальными единицами перевода и не будут конфликтовать во время ссылки. Но разница в том, что a1
в анонимном пространстве имен получается уникальное имя.
Прочитайте отличную статью на comeau-computing. Почему вместо статического используется безымянное пространство имен? ( Архив Archive.org ).
Йоханнес Шауб - Литб
источник
static
. Можете ли вы также сравнить с__attribute__ ((visibility ("hidden")))
?Наличие чего-либо в анонимном пространстве имен означает, что оно является локальным для этого модуля перевода (файл .cpp и всех его включений), это означает, что если в другом месте определен другой символ с таким же именем, то не будет нарушено Правило единого определения (ODR).
Это то же самое, что и способ C иметь статическую глобальную переменную или статическую функцию, но он также может использоваться для определений классов (и должен использоваться, а не
static
в C ++).Все анонимные пространства имен в одном и том же файле рассматриваются как одно и то же пространство имен, и все анонимные пространства имен в разных файлах различны. Анонимное пространство имен эквивалентно:
источник
Безымянное пространство имен ограничивает доступ класса, переменной, функции и объектов к файлу, в котором он определен. Безымянная функциональность пространства имен похожа на
static
ключевое слово в C / C ++.static
Ключевое слово ограничивает доступ глобальной переменной и функции к файлу, в котором они определены.Существует различие между безымянным пространством имен и
static
ключевым словом, из-за которого безымянное пространство имен имеет преимущество перед статическим.static
Ключевое слово может использоваться с переменной, функцией и объектами, но не с определенным пользователем классом.Например:
Но,
Но то же самое может быть возможно с безымянным пространством имен. Например,
источник
В дополнение к другим ответам на этот вопрос, использование анонимного пространства имен также может повысить производительность. Поскольку символы в пространстве имен не нуждаются в каких-либо внешних связях, компилятор свободнее выполнять агрессивную оптимизацию кода в пространстве имен. Например, функция, которая вызывается несколько раз в цикле, может быть встроена без какого-либо влияния на размер кода.
Например, в моей системе следующий код занимает около 70% времени выполнения, если используется анонимное пространство имен (x86-64 gcc-4.6.3 и -O2; обратите внимание, что дополнительный код в add_val заставляет компилятор не хотеть включать это дважды).
источник
-O3
с самим собой, затем вы сказали, что 3 против 4 секунд "то же самое время". ни один из них не имеет смысла. Я подозреваю, что реальное объяснение будет, но что это?Пример показывает, что люди в проекте, к которому вы присоединились, не понимают анонимных пространств имен :)
Они не обязательно должны находиться в анонимном пространстве имен, поскольку
const
объект уже имеет статическую связь и, следовательно, не может конфликтовать с идентификаторами с тем же именем в другом модуле перевода.И это на самом деле пессимизация:
getState()
имеет внешнюю связь. Обычно лучше использовать статическую связь, так как это не загрязняет таблицу символов. Лучше написатьВот. Я попал в ту же ловушку (в стандарте есть формулировка, предполагающая, что статика файлов как-то устарела в пользу анонимных пространств имен), но работая в большом проекте на C ++, таком как KDE, вы получаете множество людей, которые правильно поворачивают голову снова вокруг :)
источник
const
ness позже при желании. Я сомневаюсь, что это означает, что команда ОП "ничего не понимает"! Также, как отмечалось, в C ++ 11 и далее неправильно рассказывается о функциях в анонимных пространствах имен, имеющих внешнюю связь. Насколько я понимаю, они устранили проблему с аргументами шаблона, ранее нуждающимися во внешней связи, поэтому могли позволить безымянным пространствам имен (способным содержать аргументы шаблона) иметь внутреннюю связь.Анонимное пространство имен делает вложенные переменные, функции, классы и т. Д. Доступными только внутри этого файла. В вашем примере это способ избежать глобальных переменных. Нет разницы во времени выполнения или компиляции.
Существует не так много преимуществ или недостатков, кроме "хочу ли я, чтобы эта переменная, функция, класс и т. Д. Были открытыми или закрытыми?"
источник