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 ?
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 ?
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.
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;
}
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
Si ss
est de type const char *
et vous n'êtes pas en jetant l' const
ness à 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
}
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.