Me acabo de unir a un nuevo proyecto de software C ++ y estoy tratando de entender el diseño. El proyecto hace un uso frecuente de espacios de nombres sin nombre. Por ejemplo, algo como esto puede ocurrir en un archivo de definición de clase:
// newusertype.cc
namespace {
const int SIZE_OF_ARRAY_X;
const int SIZE_OF_ARRAY_Y;
bool getState(userType*,otherUserType*);
}
newusertype::newusertype(...) {...
¿Cuáles son las consideraciones de diseño que pueden hacer que uno use un espacio de nombres sin nombre? ¿Cuáles son las ventajas y desventajas?
Los espacios de nombres sin nombre son una utilidad para hacer que una unidad de traducción de identificadores 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 de usar el cuerpo vacío es importante, por lo que ya puede hacer referencia dentro del cuerpo del espacio de nombres a identificadores como los ::name
que están definidos en ese espacio de nombres, ya que la directiva using ya se llevó a cabo.
Esto significa que puede tener funciones gratuitas llamadas (por ejemplo) help
que pueden existir en varias unidades de traducción y no entrarán en conflicto 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 tipos sea local.
namespace { int a1; }
static int a2;
Ambos a
son unidades de traducción locales y no entrarán en conflicto en el momento del enlace. Pero la diferencia es que a1
en el espacio de nombres anónimo obtiene un nombre único.
Lea el excelente artículo en comeau-computing ¿Por qué se usa un espacio de nombres sin nombre en lugar de estático? ( Espejo de Archive.org ).
Tener algo en un espacio de nombres anónimo significa que es local para esta unidad de traducción (archivo .cpp y todas sus inclusiones), esto significa que si otro símbolo con el mismo nombre se define en otro lugar, no habrá una violación de la regla de una definición (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 se puede usar para definiciones de clases (y se debe usar 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 archivos diferentes son distintos. Un espacio de nombres anónimo es el equivalente a:
namespace __unique_compiler_generated_identifer0x42 {
...
}
using namespace __unique_compiler_generated_identifer0x42;
El espacio de nombres sin nombre limita el acceso de clase, variable, función y objetos al archivo en el que está definido. 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 están definidas.
Existe 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 el estático. static
La palabra clave se puede utilizar con variable, función y objetos, pero no con la clase definida por el usuario.
Por ejemplo:
static int x; // Correct
Pero,
static class xyz {/*Body of class*/} //Wrong
static structure {/*Body of structure*/} //Wrong
Pero lo mismo puede ser posible con un espacio de nombres sin nombre. Por ejemplo,
namespace {
class xyz {/*Body of class*/}
static structure {/*Body of structure*/}
} //Correct
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 vínculo externo, el compilador tiene más libertad 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 se puede insertar 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 usa 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).
#include <iostream>
namespace {
double a;
void b(double x)
{
a -= x;
}
void add_val(double x)
{
a += x;
if(x==0.01) b(0);
if(x==0.02) b(0.6);
if(x==0.03) b(-0.1);
if(x==0.04) b(0.4);
}
}
int main()
{
a = 0;
for(int i=0; i<1000000000; ++i)
{
add_val(i*1e-10);
}
std::cout << a << '\n';
return 0;
}
Un espacio de nombres anónimo hace que las variables, funciones, clases, etc. adjuntas estén disponibles solo dentro de ese archivo. En su ejemplo, es una forma de evitar las 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?"
El ejemplo muestra que las personas del proyecto al que se unió no comprenden los espacios de nombres anónimos :)
namespace {
const int SIZE_OF_ARRAY_X;
const int SIZE_OF_ARRAY_Y;
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 los identificadores del mismo nombre en otra unidad de traducción.
bool getState(userType*,otherUserType*);
}
Y esto es en realidad una pesimismo: getState()
tiene vinculación externa. Por lo general, es mejor preferir el enlace estático, ya que eso no contamina la tabla de símbolos. Es mejor escribir
static bool getState(/*...*/);
aquí. Caí en la misma trampa (hay una redacción en el estándar que sugiere que las estadísticas de archivos de alguna manera están en desuso a favor de los espacios de nombres anónimos), pero al trabajar en un gran proyecto de C ++ como KDE, hay muchas personas que vuelven la cabeza de la manera correcta alrededor de nuevo :)
La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.
Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.
Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.
Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.
Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.
Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?
The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!
¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?
¿Quiere probar un cepillo de dientes Sonicare sin gastar mucho dinero en uno de sus modelos favoritos de gama alta? Puede comprar un kit de la Serie 2 o Serie 3 por tan solo $ 30 hoy en Amazon. Haga clic aquí para ver la lista completa de modelos elegibles y tenga en cuenta que se descontarán $ 10 adicionales en su carrito.
Tapas elásticas de silicona de Tomorrow's Kitchen, paquete de 12 | $14 | Amazonas | Código promocional 20OFFKINJALids son básicamente los calcetines de la cocina; siempre perdiéndose, dejando contenedores huérfanos que nunca podrán volver a cerrarse. Pero, ¿y si sus tapas pudieran estirarse y adaptarse a todos los recipientes, ollas, sartenes e incluso frutas en rodajas grandes que sobran? Nunca más tendrás que preocuparte por perder esa tapa tan específica.
Hemos pirateado algunas ciudades industriales en esta columna, como Los Ángeles y Las Vegas. Ahora es el momento de una ciudad militar-industrial-compleja.
Un minorista está enlatando su sección de tallas grandes. Pero no están tomando la categoría solo en línea o descontinuándola por completo.
El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.
Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon
El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.
El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".
Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.
Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.
“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.
Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.