9
votes

Variables locales définies à l'intérieur de la boucle en C ++

dans la pièce suivante Code C ++:

    int y;
    for (int i=0;i<10;i++)
    {
        y = someFunctionCall();

        //Some statements
    }


7 Réponses :


1
votes

Une nouvelle variable est créée pour chaque tour de la boucle.

Cependant, pour une variable de type int non important. Il vaut mieux avoir une petite portée de la variable. Et le compilateur est probablement assez intelligent pour réutiliser le même espace à chaque fois.


0 commentaires

6
votes

Il sera attribué sur la pile une fois, lorsque la fonction est appelée. Performance-sage, il n'y a pas de différence entre les deux façons de le faire (mais rappelle que, avec la dernière façon, y sera toujours dans la portée de la boucle). Que la variable semble être créée et détruite entre chaque itération (de sorte qu'elle "perd" sa valeur entre itérations) est un comportement créé par le compilateur; L'emplacement de la mémoire réelle est la même tout le temps.


0 commentaires

0
votes

Je pense que la variable y allouera à chaque fois que lorsque vous entrez dans la boucle, la variable sera dellocated quand elle laisse cette portée.


1 commentaires

Au sein de la boucle, il est toujours dans la portée, il ne s'agit pas de désaffecter la pile.



3
votes

Il n'est pas attribué à chaque fois, mais il est attribué une nouvelle valeur dans chaque itération. La boucle est dans une méthode, qui a son propre cadre de pile. La variable Y est allouée dans ce cadre de pile.


0 commentaires

0
votes

Cela ne peut pas être équivalent à celui que vous avez présenté, car y serait hors de la portée de la boucle .

Mais tout dépend vraiment du compilateur, vous devez mesurer la performance entre les deux si c'est ce que vous êtes après.


0 commentaires

0
votes

Le y dans votre code est une variable locale. Malgré ce que beaucoup de gens pensent que ceux-ci ne sont pas alloués. Ils peuvent avoir ou non un peu d'espace réservé à eux sur la pile, mais cela n'est garanti que si, après des optimisations, leur adresse est prise.

Dans tous les autres cas, ils n'ont peut-être pas d'espace réservé sur la pile du tout. Ou il peut y avoir un espace sur la pile qu'elles utilisent, mais le même espace est réutilisé pour plusieurs variables ou même, dans certains cas, pour réussir les arguments aux fonctions que vous appelez.

Lorsque l'espace est réservé sur la pile (qui peut ne pas se produire) que l'espace est généralement réservé à la fois une fois la fonction de fonction. Cependant, il s'agit d'un détail de mise en œuvre. C'est fait comme ça comme c'est le moyen le plus rapide de le faire. Il n'est pas nécessaire que cela ne soit nécessaire de faire la voie et une implémentation peut très bien modifier de manière dynamique la taille du cadre de pile actuel (sur la plupart des processeurs modernes, c'est une chose stupide à faire, mais une telle mise en œuvre serait toujours correcte).


0 commentaires

0
votes

avec des types de construction, cela n'a pas vraiment d'importance (indépendamment de la visibilité). Avec des objets, si la variable d'objet reste in / sorti de la boucle de la boucle (!). Considérez les éléments suivants:

#include <iostream>

struct A
{

  static int i;
  void * a;

  A() : a(this) { ++i; }

};

int A::i = 0;

int main()
{

    for (int i = 0; i != 10; ++i)
    {

      A a;

      std::cout << a.a << " | " << a.i << std::endl;

    }

    return 0;
}


0 commentaires