Lorsque j'ai une boucle et à l'intérieur de cette boucle, crée une nouvelle variable de pile (ne pas l'allouer sur le tas et la variable la tenant déclarée à l'intérieur du corps de la boucle), le destructeur de cet objet est-il garanti d'être appelé avant le début de la prochaine itération, ou pourrait boucle déroulant par le compilateur changer quelque chose à ce sujet?
c++
destructor
user1282931
la source
la source
Réponses:
De
n4800
:§6.3.3 Portée du bloc :
§10.3.6 Destructeurs :
§4.1.1 Machine abstraite :
[Je souligne]
Donc oui. Votre variable sort du domaine à la fin de la boucle (qui est un bloc) et donc son destructeur est appelé pour autant que quiconque observe le comportement du programme puisse le dire .
la source
call
du tout édités . Ou, s'ils ne font rien (en règle générale), aucun assemblage pour ces destructeurs ne peut être généré.Oui. Il est plus facile de visualiser lorsque vous considérez les "blocs" dans lesquels vous déclarez une variable, c'est-à-dire entre quelle paire d'accolades. La boucle est un bloc en soi, et lorsqu'elle atteint la parenthèse fermante, avant la prochaine itération, tous les destructeurs de variables de stockage automatique déclarés dans la boucle sont appelés.
En règle générale, ne pensez pas à ce que le compilateur optimisera, car il doit encore garantir le comportement de votre programme, quoi qu'il fasse pour l'optimiser. Dans ce cas, le déroulement de la boucle ne changera rien à cet effet s'il se produit.
la source
[class.copy.elision]
for(...) X x{};
et l'x
objet sera construit + détruit à chaque itération. Démo en direct . Une section standard pertinente est stmt.iter / 2 .[stmt.iter]
il est purement équivalent (c'est moi qui souligne): "Si la sous-déclaration d'une instruction d'itération est une instruction unique et non une instruction composée, c'est comme si elle avait été réécrite pour être une instruction composée contenant la déclaration d'origine. ". En substance, avec ou sans les accolades pour une seule instruction signifie exactement la même chose et les accolades sont implicites. Je l'ai omis pour plus de clarté.Le destructeur est appelé pour chaque itération. Ainsi, dans certains cas, il est plus rapide de déclarer une variable en dehors de la boucle plutôt que dans la boucle. En supposant le cas suivant:
Le destructeur n'est pas appelé lorsque la boucle est exécutée. Il remplace simplement
temp
.Mais si vous utilisez
std::string temp = arr[i]
le constructeur et le destructeur est appelé pour chaque itération. Je pense que cela ajoute un peu d'exécution au cas où vous auriez une boucle qui est exécutée très souvent.la source
Le destructeur est appelé avant la prochaine itération
la source
Bien sûr, dtor est appelé à la fin de l'itération et le déroulement de la boucle ne devrait pas modifier ce comportement, comme toute autre optimisation (une optimisation ne devrait pas modifier le comportement du programme), à l'exception d'une sorte de RVO et similaire qui peut éliminer certaines créations d'objets sémantiquement parasites .
la source