2012-01-14 32 views
6

estoy tratando de comprender las implicaciones /efectos secundarios/ventajas de un reciente cambio de código que alguien hizo. El cambio es el siguiente:¿Para qué sirve este código?

original

static List<type1> Data; 

Modified

static List<type1> & getData (void) 
{ 
    static List<type1> * iList = new List<type1>; 
    return * iList; 
} 
#define Data getData() 

Qué propósito podría servir el cambio?

+0

tal vez para evitar algún tipo de inicialización estática ¿problema? – Anycorn

+2

'#define Data ...' solo está pidiendo problemas – tenfour

+0

@ Lol4t0: ¿podría explicar un poco más acerca de su comentario? ¿Cómo no es seguro para subprocesos? – Lazer

Respuesta

4

El beneficio de la revisión que puedo ver es un problema de 'tiempo de inicialización'.

El código anterior activó una inicialización antes de llamar al main().

El nuevo código no desencadena la inicialización hasta que se llame a getData() por primera vez; si nunca se llama a la función, nunca se paga para inicializar una variable que no se utilizó. El inconveniente (menor) es que hay una verificación de inicialización en el código generado cada vez que se usa la función, y hay una llamada a función cada vez que necesita acceder a la lista de datos.

+0

¿Qué pasa con el valor de vida una vez que se inicializa? ¿Será eso lo mismo? – Lazer

+0

Una vez inicializado, dura "para siempre" (hasta que el programa finaliza). Debería destruirse limpiamente, creo, si el programa sale bajo control. (Ah, pero está asignado dinámicamente, tal vez simplemente 'gotea' cuando el programa sale? Tal 'fuga' es bastante inofensiva a menos que el tipo de datos que está en la lista adquiera recursos que deben ser liberados formalmente cuando el programa finalice.) –

+0

@Lazer: Sí. el tiempo de vida es el mismo que en el caso del código original. –

3

Si tiene una variable con duración estática, se crea cuando la aplicación se inicializa. Cuando la aplicación finaliza, el objeto se destruye. No es posible controlar el orden en que se crean los diferentes objetos.

El cambio hará que el objeto se cree cuando se usa por primera vez, y (como se asigna dinámicamente) nunca se destruirá.

Esto puede ser algo bueno si otros objetos necesitan este objeto cuando se destruyen.

actualización

El código original accede al objeto utilizando la variable Data. El nuevo código no tiene que ser modificado de ninguna manera. Cuando el código use Data, de hecho, utilizará la macro Data, que se ampliará a getData(). Esta función devolverá una referencia al objeto real (objeto dinámicamente asignado). En la práctica, el nuevo código funcionará como un reemplazo directo para el código anterior, con la única diferencia notoria que es lo que describí en la respuesta original anterior.

+0

Sí, el objeto no se destruirá, pero ¿cómo se accederá? – Lazer

+0

Se accederá cuando alguien llame a 'getData', Lazer. –

1

Retrasar la construcción hasta el primer uso de Data evita el "static initialization order fiasco".

Haciendo algunas suposiciones acerca de su List, ... el default-construida Data es, probablemente, una lista vacía de type1 artículos, por lo que no es probable que haya un gran riesgo de causar el fracaso en cuestión. Pero quizás alguien sintió que era mejor estar a salvo que arrepentirse.