2010-04-27 24 views
6

Estoy interesado en las ventajas y desventajas de C++ y me pregunté qué cambia realmente cuando se crea una instancia de un objeto. Estoy particularmente interesado si las funciones se agregan a la memoria, si están allí desde el tiempo de ejecución o si nunca se almacenan en la memoria.¿Qué sucede en la memoria cuando se crea una instancia de una clase de C++?

Si alguien pudiera dirigirme a un buen sitio en algunos de los núcleos de C y C++, me encantaría eso también.

Gracias, Jo

Respuesta

1

Un caso común es:

  1. memoria se asigna llamando operator new. Esta función probablemente ya estará en la memoria, se necesita mucho.
  2. Se llama al constructor de la clase. Este código ya podría estar en la memoria. De lo contrario, la llamada a esta función falla la página. El sistema operativo toma nota y carga la página correspondiente de su ejecutable en la memoria RAM. Luego le dice al sistema operativo que vuelva a intentarlo. (2A) El ctor organiza las funciones virtuales para que se puedan llamar, a menudo escribiendo un puntero vtable)
  3. Lo más probable es que la página con el constructor también contenga los otros miembros de su clase. Esos pueden ser llamados también. Pero si están en otra página, llamarlos puede causar otro error de página y otra carga.Si su compilador coloca un vtable en una página diferente, el uso de ese vtable también puede causar un error de página.

La ventaja de tal mecanismo de carga bajo demanda es que un SO puede evitar cargar el código para la clase CPrinter si el usuario nunca tiene la intención de imprimir su documento.

1

Las funciones se almacenan en el propio ejecutable, por lo que están cargados desde el primer momento.

Se asigna la memoria necesaria para ese objeto para las variables miembro.

Si se pregunta cómo sabe la función a qué objeto se está llamando, básicamente hay un puntero invisible "this" que se pasa como el primer parámetro de la función.

+0

Incluso si el objeto no tiene ningún miembro, todavía se asigna algo de memoria para garantizar que todos los objetos tengan direcciones de memoria únicas. – Skizz

7

No estoy seguro de un buen sitio web, pero Inside The C++ Object Model es un libro bastante bueno.

Al menos en el caso habitual, las funciones miembro existen completamente independientes de cualquier instancia de la clase. En cambio, una instancia de la clase es una estructura que contiene los miembros de datos (no estáticos) del objeto. Si la clase tiene al menos una función virtual, el objeto también contendrá un puntero a vtable, que es básicamente una matriz de punteros a funciones.

Cuando se llama a una función miembro, la dirección de ese objeto se pasa como un parámetro oculto a la función (muchos compiladores reservan un registro solo para ella) y en la función se hace referencia como .

+0

No lo he leído, pero +1 solo para el TOC. –

0

Cuando se crea una instancia de un objeto;

  1. memoria se asigna
  2. El constructor se ejecuta
  3. la viable se "creó"

Número 3 es la razón por la cual los constructores no pueden llamar a funciones virtuales en las clases derivadas (cuando el constructor se ejecuta el vtable aún no está "configurado").

Puede obtener el mismo efecto utilizando una expresión de letra/sobre. Ver Advanced C++ Programming Styles and Idioms para esto y más.

+1

vtables, si bien no se garantiza que realmente existan en el estándar, tienden a inicializarse como parte del marco de trabajo del constructor. Los vtables tienden a inicializarse desde el menos derivado hasta el más derivado (en el mismo orden en que se inicializan los constructores). –

+0

@Nathan - Gracias, he estado programando en Windows por demasiado tiempo. ¿Puede hablarme de un compilador/plataforma que no usa vtables? –

0

En general, cuando se crea una instancia de una clase, se asigna un nuevo bloque de memoria. La memoria asignada contiene:

  1. Miembros de datos no estáticos de la clase y miembros heredados de datos no estáticos de la clase base.
  2. Si la clase tiene una o más funciones virtuales, la instancia de clase también contiene el puntero a virtual function table de esa clase.

Las funciones de la clase no se copian cuando se crea una nueva instancia. This ayudará a comprender qué compone el tamaño del objeto.

Cuestiones relacionadas