2011-10-11 16 views
6

Me interesó observar que C++ (VSVC++ 2008 específicamente) me permite declarar una estructura en línea en un método. por ejemplo:Inline struct declaration

MyClass::method() 
{ 
struct test{ int x;}; 
test t = {99}; 
} 

Mi pregunta es, ¿cómo funciona esta declaración internamente, y, específicamente, ¿tiene algún consecuencias negativas de rendimiento?

+0

posible duplicado de [Uso de la clase local en la función C++] (http://stackoverflow.com/questions/5714616/usage-of-local-class-inc-c- function) – Nawaz

+0

Se llama clase local. El [posible duplicado] (http://stackoverflow.com/questions/5714616/usage-of-local-class-inc-c-function) para obtener más información al respecto. – Nawaz

Respuesta

6

¿cómo funciona esta declaración internamente?

Exactamente como una declaración en el ámbito del espacio de nombres, excepto que el nombre solo es visible dentro del alcance del bloque en el que está declarado (en este caso, el cuerpo de la función). ACTUALIZACIÓN: como señala @Nawaz, hay una o dos restricciones adicionales que se aplican a las clases locales: no pueden tener miembros de datos estáticos, y (en C++ 03, pero no en C++ 11) no se pueden usar como tipo de plantilla argumentos.

¿Tiene alguna implicancia de rendimiento negativo?

No, aparte de su alcance (que solo afecta si el código se compila o no), es idéntico a cualquier otra definición de clase.

+2

Respuesta no exactamente correcta. Hay muchas diferencias entre las clases locales y las clases de espacio de nombres. Vea el posible duplicado: http: //stackoverflow.com/questions/5714616/usage-of-local-class-in-c-function – Nawaz

+0

@Nawaz: gracias, simplifiqué un poco, y no sabía que no podría tener miembros de datos estáticos. Creo que la respuesta es más correcta ahora. –

0

Si crees que la declaración struct en una función tiene un costo negativo después de cada llamada y requiere tiempo de CPU, estás equivocado. El compilador lo maneja en tiempo de compilación y le gusta declarar el struct fuera de la función (pero alcance limitado).

2

La principal diferencia de definir el tipo dentro del alcance de la función o fuera de ella es, bueno, el alcance. Es decir, si está definido dentro de la función, no será accesible fuera de la función.

Sin embargo, existen otras diferencias (al menos en C++ 03, no he vuelto a comprobar C++ 11), no puede tener un miembro estático o un miembro de plantilla en una clase local. Tampoco puede usar esa clase local como argumento para una plantilla (esta limitación se eliminó en C++ 11), y esto es porque la clase local tiene una vinculación interna (en lugar de externa para una clase de nivel de espacio de nombres) y se requieren plantillas los argumentos a ser de vinculación externa.