2 Question: variables auto et objets auto affectation de la mémoire dans une boucle

question créée à Thu, Mar 28, 2019 12:00 AM

Quelqu'un peut-il me dire combien de fois la variable entier1 allouée et désallouée? que diriez-vous class_object? Est-il vrai que les deux allouent et désallouent trois fois?

for(int i = 0; i < 3; i++){
    int integer1;
    Class1 class_object(some_parameter);
}
    
- 5
  1. La règle "en tant que si" supprimera probablement le code 0600350991111101035062 interne, et éventuellement le code externe également en raison du déroulement de la boucle.
    2019-03-28 11: 59: 39Z
  2. Il y a deux variables distinctes nommées 0600350991111101035062. Aucune d'entre elles n'est "allouée et désallouée", votre question n'a donc pas de sens.
    2019-03-28 12: 05: 34Z
  3. Si le compilateur détermine qu'il est nécessaire de réserver de l'espace de stockage pour les variables automatiques, il peut être réutilisé pour des objets dont la durée de vie ne se chevauche pas.
    2019-03-28 12: 30: 45Z
  4. Si vous voulez demander si les variables ont été créées et détruites à trois reprises, alors oui, elles l'ont été. "Allouer" signifie généralement quelque chose de différent.
    2019-03-28 12: 49: 42Z
  5. Je m'attends à ce que i se voit probablement attribuer 0, 1 ou 3 fois selon le compilateur. La norme a cela comme détail de la mise en œuvre.
    2019-03-28 14: 37: 38Z
2 réponses                              2                         

Pour les variables locales, l’allocation et la désallocation sont spécifiques au compilateur. Allocation /désallocation pour les variables locales signifie réserver de l'espace sur la pile. Cependant, la plupart des compilateurs déplacent l'allocation et la désallocation des variables hors de la boucle et réutilisent le même espace pour la variable à chaque fois.

Il y aurait donc une allocation, ce qui signifie changer le pointeur de la pile avant la boucle, et une désallocation, ce qui signifie restaurer le pointeur de la pile après la boucle. De nombreux compilateurs calculent l’espace maximum nécessaire à la fonction et ne l’allouent qu’une seule fois lors de l’entrée de la fonction. L'espace de pile peut également être réutilisé lorsque le compilateur voit que la durée de vie d'une variable est terminée ou qu'elle n'est tout simplement plus accessible par un code ultérieur. Il est donc plutôt inutile de parler d’allocation et de désaffectation.

Ne vous intéressez-vous pas au nombre de constructions et de déconstructions qui s’ensuit? Dans ce cas, oui, le constructeur de Class1 est appelé 3 fois et le destructeur aussi. Mais encore une fois, le compilateur peut optimiser cela tant que le résultat se comporte "comme si" le constructeur /destructeur était appelé.

PS: si l’adresse de quelque chose n’est jamais prise (ou peut être optimisée), le compilateur risque même de ne pas réserver d’espace de pile et de ne conserver que la variable dans un registre pendant toute la durée de vie.

    
3
2019-03-28 13: 04: 29Z

Pour les variables automatiques (pile locale), le compilateur réserve de l'espace sur la pile.

Dans ce cas (si nous ignorons les optimisations), le compilateur réservera un espace pour 06003509911110010105062 et 0600350991111101035062 qui sera probablement réutilisé à chaque itération de boucle.

Pour les types de données de base, rien n’est fait au-delà de cela, mais pour les classes, le compilateur appellera le constructeur lorsqu’il entrera dans la portée de la variable et le destructeur lorsque la variable sortira de sa portée.

Les deux variables les plus probables auront la même adresse à chaque itération de la boucle (mais cela ne doit pas nécessairement être vrai du point de vue des normes).

Le terme i désigne généralement une demande de mémoire de tas ou d’autres ressources auprès du système d’exploitation. En ce qui concerne cette définition, rien n’est attribué.

Mais assigner de l’espace de pile (ou un registre) à une variable automatique peut aussi être appelé integer1, la plupart des compilateurs allocate memory une fois (en définissant le cadre de la pile sur une valeur suffisamment grande en entrant dans la routine.

Résumé:
A la fin, c'est totalement au compilateur. Vous êtes simplement assuré d'obtenir un objet valide dans sa portée

    
1
2019-03-28 12: 58: 30Z
integer1
source placée ici