Considérez l'implémentation de liste liée individuellement suivante:
struct node {
std::unique_ptr<node> next;
ComplicatedDestructorClass data;
}
Supposons maintenant que j'arrête d'utiliser une std::unique_ptr<node> headinstance qui sort alors du champ d'application, provoquant l'appel de son destructeur.
Est-ce que cela fera exploser ma pile de listes suffisamment grandes? Est-il juste de supposer que le compilateur fera une optimisation assez compliquée (le unique_ptrdestructeur en ligne dans nodele s, puis utilisera la récursivité de la queue), ce qui devient beaucoup plus difficile si je fais ce qui suit (puisque le datadestructeur masquerait nextle sien , le rendant difficile pour que le compilateur remarque la possibilité de réorganisation et d'appel de queue):
struct node {
std::shared_ptr<node> next;
ComplicatedDestructorClass data;
}
Si en dataquelque sorte a un pointeur vers son, nodeil peut même être impossible pour la récursivité de la queue (bien que nous devrions bien sûr nous efforcer d'éviter de telles violations de l'encapsulation).
En général, comment est-il censé détruire cette liste sinon? Nous ne pouvons pas parcourir la liste et supprimer le nœud "actuel" car le pointeur partagé n'en a pas release! Le seul moyen est avec un deleter personnalisé, qui me fait vraiment mal.
gcc -O3n'a pas pu optimiser une récursivité de queue (dans un exemple compliqué).