Je vais faire une supposition folle:
Le constructeur et le destructeur C ++ ne sont pas du tout des fonctions: ce sont des macros. Ils sont alignés dans la portée où l'objet est créé et dans la portée où l'objet est détruit. À son tour, il n'y a ni constructeur ni destructeur, l'objet EST juste.
En fait, je pense que les autres fonctions de la classe ne sont pas des fonctions non plus, mais des fonctions en ligne qui ne sont PAS en ligne parce que vous en prenez l'adresse (le compilateur se rend compte que vous y êtes et n'inline pas ou n'inline pas le code dans la fonction et optimise cette fonction) et à son tour, la fonction semble "toujours là", même si ce ne serait pas le cas si vous ne l'avez pas prise en compte.
La table virtuelle de "l'objet" C ++ n'est pas comme un objet JavaScript, où vous pouvez obtenir son 'constructeur et créer des objets à partir de celui-ci lors de l'exécution via new XMLHttpRequest.constructor
, mais plutôt une collection de pointeurs vers des fonctions anonymes qui agissent comme un moyen d'interfacer avec cet objet. , à l'exclusion de la possibilité de créer l'objet. Et cela n'a même pas de sens de "supprimer" l'objet, car c'est comme essayer de supprimer une structure, vous ne pouvez pas: c'est juste une étiquette de pile, écrivez-la comme bon vous semble sous une autre étiquette: vous êtes libre de utilisez une classe comme 4 entiers:
/* 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;
Il n'y a pas de fuite de mémoire, il n'y a pas de problèmes, sauf que vous avez effectivement gaspillé un tas d'espace de pile réservé à l'interface et à la chaîne, mais cela ne détruira pas votre programme (tant que vous n'essayez pas de l'utiliser) comme une chaîne jamais plus).
En fait, si mes hypothèses précédentes sont correctes: le coût complet de la chaîne est juste le coût de stockage de ces 32 octets et de l'espace de chaîne constant: les fonctions ne sont utilisées qu'au moment de la compilation, et peuvent également être intégrées et jetées après l'objet est créé et utilisé (comme si vous travailliez avec une structure et ne vous y référiez que directement sans appel de fonction, assurez-vous qu'il y a des appels en double au lieu des sauts de fonction, mais cela est généralement plus rapide et utilise moins d'espace). En substance, chaque fois que vous appelez une fonction, le compilateur remplace simplement cet appel par les instructions pour le faire littéralement, à des exceptions que les concepteurs de langage ont définies.
Résumé: les objets C ++ n'ont aucune idée de ce qu'ils sont; tous les outils d'interfaçage avec eux sont statiquement intégrés et perdus lors de l'exécution. Cela rend le travail avec les classes aussi efficace que le remplissage des structures avec des données, et le travail direct avec ces données sans appeler aucune fonction (ces fonctions sont intégrées).
Ceci est complètement différent des approches de COM / ObjectiveC ainsi que du javascript, qui conservent les informations de type de manière dynamique, au détriment du temps d'exécution, de la gestion de la mémoire, des appels de constructions, car le compilateur ne peut pas jeter ces informations: c'est nécessaire pour une répartition dynamique. Cela nous donne à son tour la possibilité de «parler» à notre programme au moment de l'exécution et de le développer pendant son exécution en ayant des composants réfléchissants.