169 votes

La déclaration d'une variable dans une boucle entraîne-t-elle des frais supplémentaires ? (C++)

Je me demande simplement s'il y aurait une perte de vitesse ou d'efficacité si vous faisiez quelque chose comme ça :

int i = 0;
while(i < 100)
{
    int var = 4;
    i++;
}

qui déclare int var cent fois. Il me semble qu'il y en aurait, mais je n'en suis pas sûr. Ne serait-il pas plus pratique/rapide de faire ceci à la place :

int i = 0;
int var;
while(i < 100)
{
    var = 4;
    i++;
}

ou sont-ils identiques, en termes de vitesse et d'efficacité ?

7 votes

Pour être clair, le code ci-dessus ne "déclare" pas cent fois var.

1 votes

@Rabarberski : La question référencée n'est pas un doublon exact car elle ne précise pas de langue. Cette question est spécifique au C++ . Mais selon les réponses postées à votre question référencée, la réponse dépend du langage et éventuellement du compilateur.

2 votes

@jason Si le premier bout de code ne déclare pas cent fois la variable 'var', pouvez-vous expliquer ce qui se passe ? Est-ce qu'il déclare la variable une fois et l'initialise 100 fois ? J'aurais pensé que le code déclarait et initialisait la variable 100 fois, puisque tout dans la boucle est exécuté 100 fois. Merci.

-1voto

Rob Points 1

Je pense que la plupart des réponses passent à côté d'un point majeur à considérer qui est : "Est-ce que c'est clair" et manifestement, d'après toutes les discussions, le fait est que non, ça ne l'est pas. Je dirais que dans la plupart des codes en boucle, l'efficacité n'est pas un problème (sauf si vous calculez pour un atterrisseur de mars), donc la seule question est de savoir ce qui est le plus raisonnable, le plus lisible et le plus facile à maintenir - dans ce cas, je recommanderais de déclarer la variable à l'avance et en dehors de la boucle - cela rend simplement les choses plus claires. Dans ce cas, je recommanderais de déclarer la variable en amont et en dehors de la boucle, ce qui est tout simplement plus clair. Ainsi, les gens comme vous et moi n'auraient pas à perdre de temps à vérifier en ligne si elle est valide ou non.

-6voto

grobartn Points 683

Ce n'est pas vrai. Il y a des frais généraux, mais ils sont négligeables.

Même s'il est probable qu'ils se retrouvent au même endroit sur la pile, il les assigne quand même. Il assignera un emplacement mémoire sur la pile pour cet int et le libérera à la fin de }. Pas dans le sens de la libération du tas, mais dans le sens où il va déplacer sp (pointeur de pile) de 1. Et dans votre cas, étant donné qu'il n'a qu'une seule variable locale, il va simplement égaliser fp (frame pointer) et sp.

La réponse courte serait : PEU IMPORTE, L'UN OU L'AUTRE FONCTIONNE PRESQUE DE LA MÊME MANIÈRE.

Mais essayez de lire davantage sur la façon dont la pile est organisée. Mon école de premier cycle avait de très bons cours sur ce sujet. Si vous voulez en savoir plus, regardez ici http://www.cs.utk.edu/~plank/plank/classes/cs360/360/notes/Assembler1/lecture.html

0 votes

Encore une fois, c'est faux. Lisez le post qui a examiné l'assemblage.

0 votes

Non, vous avez tort. regardez le code assembleur généré avec ce code

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X