2012-06-11 15 views
19

Solo por curiosidad ...¿Hay alguna "penalización" por definir una estructura dentro de una función?

Como dice el título: ¿hay alguna "penalización" por definir una estructura dentro de una función? (como rendimiento, memoria, mala práctica de programación, etc.)


P. S. Sé que es una práctica común definir funtores (NO de plantilla) dentro de las funciones, pero aún así ...)

+1

La única "penalización" que se me ocurre es que las instancias de estructura no se pueden referenciar desde fuera de la función. –

+1

@JoachimPileborg - por supuesto, tengo esto en mente. Podría ser una ventaja, no una "penalización", dependiendo de la situación. –

+3

LOL, ¿voto abajo? –

Respuesta

17

En C++ 11, no, no hay penalización. Incluso consideraría un muy buen estilo el no contaminar ningún ámbito "más visible" con los detalles de implementación, a menos que, por supuesto, quiera reutilizarlo en otro lugar. Sin embargo, lambdas son esencialmente una forma condensada de esta idea, y generalmente deberían preferirse si solo está utilizando struct como functor. Para todo tipo de datos, está perfectamente bien, aunque generalmente compite con std::pair y std::tuple en ese aspecto.

En C++ 03, no puede usar una estructura como un parámetro de plantilla, ya que esos parámetros necesitan tener un enlace externo (Visual Studio le permite hacerlo de todos modos). Todavía puede ser útil usar dicha estructura con una interfaz polimórfica.

+0

¿Esto significa que en C++ 11, se permiten los parámetros de la plantilla? –

+0

Sí, están permitidos. – ltjax

+0

Bonito :) ¡Es bueno saberlo, gracias! –

4

Dado que es un problema puramente de visibilidad, no puedo imaginar un escenario plausible en el que habría un rendimiento o penalización de memoria.

+0

Creo que el autor se refería a "malas prácticas de programación" en general cuando escribió "mal estilo" ... Tal vez :) – penelope

+0

@penelope - cierto. EditadoGracias :) –

0

Si está utilizando C++ 03, entonces técnicamente no puede usar una estructura definida localmente como un argumento de plantilla, pero algunos compiladores (es decir, MSVC) lo permiten.

0

Sé que preguntaste sobre el rendimiento, pero me preguntaba sobre otro problema. ¿Estás pidiendo C y C++ o solo uno de esos idiomas? Supongo que quieres definir una estructura en una función para fines de alcance u ocultar la estructura.

Para C, puede acercarse a ocultar cosas al definir y declarar estructuras en un módulo separado y convertirlas en estáticas. Luego, puede proporcionar funciones de acceso, tal como lo haría con los miembros de una clase de C++. Debería incluir declaraciones de funciones en un archivo .h para aquellos módulos que necesitan acceder a las estructuras.

Si esto es para C++, al crear una clase y hacer que la estructura sea privada o protegida junto con su escritura, los métodos apropiados get/set/manipulate se encargan del resto.

Si editó su publicación original y expandió el motivo por el que pregunta esto, ha hecho una buena pregunta.

+0

Estoy pidiendo ambos - C y C++, como dije, es solo por curiosidad, ya que lo hice varias veces en estos días (estructura dentro de la función). Gracias por darme algunas alternativas, las conozco y solo me preguntaba sobre este caso exacto, debería evitar tales cosas o no. Gracias de todos modos :) –

Cuestiones relacionadas