Dans le livre C++ efficace j'ai vu le passage ci-dessous :
Par conséquent, si vous écrivez
class Empty{};
c'est essentiellement la même chose que si vous aviez écrit ceci :
class Empty { public: Empty() { ... } Empty(const Empty& rhs) { ... } ~Empty() { ... } Empty& operator=(const Empty& rhs) { ... } // copy assignment operator };
Le code suivant fera en sorte que chaque fonction soit générée :
Empty e1; Empty e2(e1); e2 = e1;
Mais après avoir désassemblé le fichier exécutable qui a été créé en compilant le code ci-dessus, j'ai réalisé que ce n'était pas le cas : il n'y a pas de fonction invoquée.
Voici le principal code d'assemblage :
00000000004006cd <main>:
4006cd: 55 push %rbp
4006ce: 48 89 e5 mov %rsp,%rbp
4006d1: b8 00 00 00 00 mov $0x0,%eax
4006d6: 5d pop %rbp
4006d7: c3 retq
Il n'y a pas de fonction nommée "Empty" dans l'application .text
segment.
Alors quel est en effet le comportement d'un compilateur après que nous ayons appelé un constructeur ou une affectation d'une classe vide ? Génère-t-il des fonctions comme le dit le livre ? Si oui, où sont-elles stockées ?