Voy a adivinar:
El constructor y destructor de C ++ no son funciones en absoluto: son macros. Se insertan en el alcance donde se crea el objeto y el alcance donde se destruye el objeto. A su vez, no hay constructor ni destructor, el objeto simplemente ES.
En realidad, creo que las otras funciones en la clase tampoco son funciones, sino funciones en línea que NO se insertan porque tomas la dirección de ellas (el compilador se da cuenta de que estás en él y no inserta o inserta el código en la función y optimiza esa función) y, a su vez, la función parece "seguir estando allí", aunque no lo haría si no se hubiera tomado la dirección.
La tabla virtual del "objeto" C ++ no es como un objeto JavaScript, donde puede obtener su 'constructor y crear objetos a partir de él en tiempo de ejecución new XMLHttpRequest.constructor
, sino más bien una colección de punteros a funciones anónimas que actúan como medios para interactuar con este objeto , excluyendo la capacidad de crear el objeto. Y ni siquiera tiene sentido "eliminar" el objeto, porque es como tratar de eliminar una estructura, no puedes: es solo una etiqueta de pila, solo escríbela como quieras debajo de otra etiqueta: eres libre de usa una clase como 4 enteros:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
No hay pérdida de memoria, no hay problemas, excepto que efectivamente desperdició un montón de espacio de pila reservado para la interfaz de objetos y la cadena, pero no va a destruir su programa (siempre y cuando no intente usarlo como una cuerda nunca más).
En realidad, si mis suposiciones anteriores son correctas: el costo completo de la cadena es solo el costo de almacenar estos 32 bytes y el espacio constante de la cadena: las funciones solo se usan en el momento de la compilación, y también pueden alinearse y desecharse después el objeto se crea y se usa (como si estuviera trabajando con una estructura y solo se refiriera a él directamente sin llamadas a funciones, asegúrese de que haya llamadas duplicadas en lugar de saltos de funciones, pero esto generalmente es más rápido y usa menos espacio). En esencia, cada vez que llama a cualquier función, el compilador simplemente reemplaza esa llamada con las instrucciones para hacerlo literalmente, con las excepciones que los diseñadores de idiomas han establecido.
Resumen: los objetos C ++ no tienen idea de lo que son; Todas las herramientas para interactuar con ellas están alineadas estáticamente y se pierden en tiempo de ejecución. Esto hace que trabajar con clases sea tan eficiente como llenar estructuras con datos y trabajar directamente con esos datos sin llamar a ninguna función (estas funciones están en línea).
Esto es completamente diferente de los enfoques de COM / ObjectiveC y javascript, que retienen la información de tipo dinámicamente, a costa de tiempo de ejecución, administración de memoria, llamadas de construcciones, ya que el compilador no puede tirar esta información: es necesario para despacho dinámico. Esto a su vez nos da la capacidad de "Hablar" con nuestro programa en tiempo de ejecución y desarrollarlo mientras se ejecuta al tener componentes reflectantes.