Los espacios de nombres sin nombre son una utilidad para hacer que una unidad de traducción del identificador sea local. Se comportan como si eligiera un nombre único por unidad de traducción para un espacio de nombres:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
El paso adicional que usa el cuerpo vacío es importante, por lo que ya puede referirse dentro del cuerpo del espacio de nombres a identificadores como ::name
ese que están definidos en ese espacio de nombres, ya que la directiva de uso ya tuvo lugar.
Esto significa que puede tener funciones gratuitas llamadas (por ejemplo) help
que pueden existir en múltiples unidades de traducción, y no chocarán en el momento del enlace. El efecto es casi idéntico al uso de la static
palabra clave utilizada en C que puede incluir en la declaración de identificadores. Los espacios de nombres sin nombre son una alternativa superior, pudiendo incluso hacer que una unidad de traducción de tipo sea local.
namespace { int a1; }
static int a2;
Ambas a
son unidades de traducción locales y no chocarán en el momento del enlace. Pero la diferencia es que el a1
espacio de nombres anónimo obtiene un nombre único.
Lea el excelente artículo en comeau-computing ¿Por qué se utiliza un espacio de nombres sin nombre en lugar de estático? ( Archive.org espejo ).
Johannes Schaub - litb
fuente
static
. ¿Puedes por favor también comparar con__attribute__ ((visibility ("hidden")))
?Tener algo en un espacio de nombres anónimo significa que es local para esta unidad de traducción (archivo .cpp y todo lo que incluye), esto significa que si se define otro símbolo con el mismo nombre en otra parte, no habrá una violación de la Regla de definición única (ODR).
Esto es lo mismo que la forma en C de tener una variable global estática o una función estática, pero también puede usarse para definiciones de clase (y debería usarse en lugar de
static
en C ++).Todos los espacios de nombres anónimos en el mismo archivo se tratan como el mismo espacio de nombres y todos los espacios de nombres anónimos en diferentes archivos son distintos. Un espacio de nombres anónimo es el equivalente de:
fuente
El espacio de nombres sin nombre limita el acceso de clase, variable, función y objetos al archivo en el que se define. La funcionalidad del espacio de nombres sin nombre es similar a la
static
palabra clave en C / C ++.static
La palabra clave limita el acceso de la variable global y la función al archivo en el que se definen.Hay una diferencia entre el espacio de nombres sin nombre y la
static
palabra clave debido a que el espacio de nombres sin nombre tiene ventaja sobre la estática.static
La palabra clave se puede usar con variables, funciones y objetos, pero no con la clase definida por el usuario.Por ejemplo:
Pero,
Pero lo mismo puede ser posible con un espacio de nombres sin nombre. Por ejemplo,
fuente
Además de las otras respuestas a esta pregunta, el uso de un espacio de nombres anónimo también puede mejorar el rendimiento. Como los símbolos dentro del espacio de nombres no necesitan ningún enlace externo, el compilador es más libre para realizar una optimización agresiva del código dentro del espacio de nombres. Por ejemplo, una función que se llama varias veces una vez en un bucle puede integrarse sin ningún impacto en el tamaño del código.
Por ejemplo, en mi sistema, el siguiente código toma alrededor del 70% del tiempo de ejecución si se utiliza el espacio de nombres anónimo (x86-64 gcc-4.6.3 y -O2; tenga en cuenta que el código adicional en add_val hace que el compilador no quiera incluir dos veces)
fuente
-O3
con sí mismo, luego dijo que 3 vs 4 segundos son "al mismo tiempo". ninguno de estos tiene un poco de sentido. Sospecho que la explicación real sería, pero ¿qué es?El ejemplo muestra que las personas en el proyecto al que se unió no entienden espacios de nombres anónimos :)
No es necesario que estén en un espacio de nombres anónimo, ya que el
const
objeto ya tiene un enlace estático y, por lo tanto, no puede entrar en conflicto con identificadores del mismo nombre en otra unidad de traducción.Y esto es en realidad una pesimización:
getState()
tiene un vínculo externo. Por lo general, es mejor preferir el enlace estático, ya que eso no contamina la tabla de símbolos. Es mejor escribiraquí. Caí en la misma trampa (hay una redacción en el estándar que sugiere que los archivos estáticos de alguna manera están en desuso a favor de espacios de nombres anónimos), pero al trabajar en un gran proyecto de C ++ como KDE, obtienes muchas personas que vuelven la cabeza de la manera correcta alrededor de nuevo :)
fuente
const
Ness más tarde si lo desea. ¡Dudo que eso signifique que el equipo de OP "no entiende" nada! Además, el bit sobre las funciones en espacios de nombres anónimos que tienen un enlace externo es incorrecto en C ++ 11 en adelante, como se señaló. Según tengo entendido, solucionaron un problema de argumentos de plantillas que anteriormente necesitaban enlaces externos, por lo que podrían permitir que los espacios de nombres sin nombre (capaces de contener argumentos de plantillas) tengan enlaces internos.Un espacio de nombres anónimo hace que las variables, funciones, clases, etc. incluidas solo estén disponibles dentro de ese archivo. En su ejemplo, es una forma de evitar variables globales. No hay diferencia de rendimiento en tiempo de ejecución o tiempo de compilación.
No hay tanta ventaja o desventaja aparte de "¿quiero que esta variable, función, clase, etc. sea pública o privada?"
fuente