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> head
instance 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_ptr
destructeur en ligne dans node
le s, puis utilisera la récursivité de la queue), ce qui devient beaucoup plus difficile si je fais ce qui suit (puisque le data
destructeur masquerait next
le 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 data
quelque sorte a un pointeur vers son, node
il 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 -O3
n'a pas pu optimiser une récursivité de queue (dans un exemple compliqué).