Чтобы немного расширить сказанное Кайлом:
Пространства имен - это не что иное, как синтаксический способ для пользователя и компилятора помещать имена в разные сегменты. Они существуют, чтобы позволить вам использовать более общие и подходящие имена для вещей, не беспокоясь о конфликтах с кем-то еще. std::vector
отличается от математического vector
класса. Они могут иметь одно и то же имя, если находятся в разных пространствах имен.
Что касается компилятора, функция в пространстве имен ничем не отличается от функции где-либо еще. У него просто забавное имя. Действительно, компиляторам предоставляется свобода делать то, что называется «искажение имени»: когда компилятор видит std::vector<int>
, он может фактически преобразовать это в нечто вроде __std~~vector~t~~int32_t~~__
или что-то еще. Алгоритм искажения выбирается таким образом, чтобы ни одно пользовательское имя в глобальном пространстве имен не могло совпадать с именем, используемым диспетчером пространства имен. Таким образом, все имена в пространстве имен отделены от имен в других пространствах имен, даже глобальных.
По сути, первым шагом в процессе компиляции является эффективное удаление пространств имен. Поэтому более поздние шаги компилятора не имеют понятия, в каком пространстве имен что-то находится. Поэтому они не могут генерировать из него код. И, таким образом, пространства имен не могут влиять на скорость выполнения скомпилированного кода.
Папки ... не могут возможно иметь значение. После компиляции вы получаете один исполняемый файл, библиотеку или DLL. Если компилятор когда-либо генерировал код, основанный на расположении исходных файлов, вам бы посоветовали избегать такого компилятора, как чума. Авторы компилятора должны будут троллить своих пользователей, чтобы это произошло.