2010-06-14 15 views
5

Quiero saber, en C++, ¿cuándo tiene lugar la inicialización de los objetos?
¿Está en el tiempo de compilación o tiempo de enlace?
Por ejemplo:inicialización de objetos en C++

//file1.cpp 
extern int i; 
int j=5; 

//file2.cpp (link with file1.cpp) 
extern j; 
int i=10; 

Ahora, lo que hace compilador de hacer: en mi opinión, se asigna almacenamiento para las variables.
Ahora quiero saber:
¿también pone el valor de inicialización en ese almacenamiento o se hace en el tiempo del enlace?

Respuesta

2

En realidad hay casos diferentes:

  • variables globales o variables estáticas (no clases): estos valores se almacenan en una sección init de exe/dll. Estos valores son creados por el vinculador en función de la información de los archivos de objeto compilados. (inicialización al cargar + mapeo del dll/exe en la memoria)
  • variables locales no estáticas: estos valores son establecidos por el compilador al poner estos valores en la pila (push/pop en x86) (inicialización del compilador)
  • objetos : la memoria está reservada en la pila, la configuración real de los valores se difiere a la llamada al constructor (inicialización en tiempo de ejecución)
  • punteros a los objetos (no es un caso nuevo): el espacio está reservado solo para el puntero. El objeto señalado existe solo después de una llamada a new que reserva memoria y llama al constructor para inicializarlo (inicialización en tiempo de ejecución)
+0

¿Qué pasa con los miembros de "static const" (no las clases)? ¿Realmente existen como una 'variable'? Creo que cada uso de ellos simplemente se reemplaza por el valor y la "variable de constante estática" simplemente desaparece. ¿Derecha? Por lo demás, buena visión general, +1. – Patrick

+0

Ok ... Así que en el código de arriba ... ¿Seguirán las cosas sucederá? 1. al compilar file1.cpp, el compilador deja i como está, es decir, no asigna almacenamiento para i. 2. el compilador asigna almacenamiento para j, pero no lo inicializa. 3. Al compilar file2.cpp, el compilador deja j como está i.e no asigna almacenamiento para ello. 4. el compilador asigna almacenamiento para i, pero no lo inicializa. 5. Mientras enlaza file1.o y file2.o, ahora permite que file2.o se inicialice primero, entonces ahora: ¿Tiene j el valor inicial de 0? o no se inicializa? –

+0

@Patrick, buen punto, no estoy seguro. Supongo que tienes razón, ya que el costo de tener una variable es más alto que un valor en línea para los tipos básicos. Sin embargo, no está 100% seguro de que todos los compiladores se comporten de esa manera ... – jdehaan

0

Como dijo, el compilador asigna almacenamiento para las variables. Creo que el valor de inicialización también se realizará en tiempo de compilación y no durante el tiempo de enlace.

+0

Pero leí en un libro que el compilador no puede determinar lo que sería valioso en una almacenamiento, es por eso que no podemos usar algo como esto: int a = 5; int arr [a]; –

+0

@Happy Si el compilador hizo suficiente análisis estático para darse cuenta de que se podría convertir a 'int arr [5];' estaría bien, pero generalmente no (es posible que ni siquiera esté permitido por la especificación) –

+0

razón para int a = 5; int arr [a]; no está definido es porque el tamaño de la matriz no está definido. Más tarde puede cambiar a 10 en ese momento, ¿cómo cree que el compilador redimensionará el tamaño declarado previamente? – ckv

0

No hay objetos en su ejemplo, solo int s. Si con "inicialización" quiere decir cuándo se les asignan sus valores, esos int s se convertirán en entradas de tamaño de palabra en una sección de datos en el archivo objeto, que se codificará con sus valores iniciales. La sección de datos, junto con el resto del archivo de objeto, es creado por el compilador, así que supongo que la respuesta a su pregunta es tiempo de compilación

+0

si considera OOP entonces podemos decir int también como una clase. – ckv

+0

@vis Ints no son clases en C++, son de tipo primitivo; no hay llamada de constructor ni ninguno de los otros andamios asociados con las clases –

+0

Eso es correcto. Entiendo. tal vez debemos cambiar la pregunta a Inicialización de variables en lugar de objetos. – ckv