113 votes

Strlen ici sera calculée plusieurs fois ?

Je ne sais pas si le code suivant peut provoquer des calculs redondants, ou est-ce spécifique au compilateur ?

Il en sera de être calculé à chaque fois lorsque augmente ?

143voto

Mike Seymour Points 130519

Oui, strlen() seront évaluées à chaque itération. Il est possible que, dans des circonstances idéales, l'optimiseur peut-être en mesure de déduire que la valeur ne changera pas, mais personnellement, je ne voudrais pas compter sur cela.

J'aimerais faire quelque chose comme

for (int i = 0, n = strlen(ss); i < n; ++i)

ou, éventuellement,

for (int i = 0; ss[i]; ++i)

aussi longtemps que la chaîne ne va pas changer la longueur lors de l'itération. Si il peut, alors vous aurez besoin d'appeler strlen() à chaque fois, ou de le manipuler via une logique plus compliquée.

14voto

codeDEXTER Points 494

Oui, à chaque fois que vous utilisez la boucle. Puis il va à chaque fois calculer la longueur de la chaîne. afin de l'utiliser comme ceci:

char str[30];
for ( int i = 0; str[i] != '\0'; i++)
{
//Something;
}

Dans le code ci-dessus str[i] vérifie seulement un personnage en particulier, dans la chaîne à l'emplacement de i chaque fois que la boucle commence un cycle, donc il va prendre moins de mémoire et est plus efficace.

Voir ce Lien pour plus d'informations.

Dans le code ci-dessous à chaque fois que la boucle s'exécute strlen va compter la longueur de l'ensemble de la chaîne qui est moins efficace, prend plus de temps et prend plus de mémoire.

char str[];
for ( int i = 0; i < strlen(str); i++)
{
//Something;
}

9voto

Misch Points 1774

Un bon compilateur ne peut pas le calculer à chaque fois, mais je ne pense pas que vous pouvez être sûr, que chaque compilateur t-il.

En plus de cela, le compilateur doit savoir, que strlen(ss) ne change pas. Ceci est vrai uniquement si la ss n'est pas modifiée dans la boucle for.

Par exemple, si vous utilisez une lecture seule fonction de la ss dans la boucle for, mais ne déclarez pas le ss-paramètre const, le compilateur ne peut pas même savoir, que les ss n'est pas modifiée dans la boucle et a pour calculer strlen(ss) à chaque itération

4voto

Praetorian Points 47122

Si ss est de type const char * et vous n'êtes pas en jetant l' constness à l'intérieur de la boucle, le compilateur peut appeler uniquement strlen une fois, si des optimisations sont activés. Mais ce n'est certainement pas un comportement qui peut être compté.

Vous devez enregistrer l' strlen résultat dans une variable et l'utilisation de cette variable dans la boucle. Si vous ne voulez pas créer une variable supplémentaire, en fonction de ce que vous faites, vous pouvez être de la bière de sortir avec l'inversion de la boucle pour parcourir à l'envers.

for( auto i = strlen(s); i > 0; --i ) {
  // do whatever
  // remember value of s[strlen(s)] is the terminating NULL character
}

3voto

alk Points 26509

Formellement, oui, strlen() devrait être appelé pour chaque itération.

Quoi qu'il en soit, je ne veux pas nier la possibilité d'une optimisation intelligente du compilateur, qui optimisera les appels successifs à strlen () après le premier.

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