Le nombre de fois strlen(word)
est exécuté dépend:
- Si
word
est déclarée comme constante (les données est constante)
- Ou le compilateur peut détecter que
word
ne change pas.
Prenons l'exemple suivant:
char word[256] = "Grow";
for (i = 0; i < strlen(word); ++i)
{
strcat(word, "*");
}
Dans cet exemple, la variable est modifiée word
acceptés dans la boucle:
0) "croître" - longueur == 4
1) « Cultiver * » - longueur == 5
2) "Cultivez **" - longueur == 6
Cependant, le compilateur peut factoriser l'appel, il est appelé une fois strlen
, si le varia ble word
est déclaré comme constante:
void my_function(const char * word)
{
for (i = 0; i < strlen(word); ++i)
{
printf("%d) %s\n", i, word);
}
return;
}
La fonction a déclaré que la word
variables sont des données constantes (en fait, un pointeur vers des données constantes). Ainsi, la longueur ne changera pas, donc le compilateur peut seulement appeler strlen
une fois. En cas de doute, vous pouvez toujours exécuter l'optimisation vous-même, ce qui peut présenter un code plus lisible dans ce cas.
C'est la bonne réponse ... en effet, cela dépend à quel point le compilateur est intelligent. – Noldorin
Dans l'exemple fourni, ceci a été fait sur un 'char *', ce qui signifie que ni le pointeur ni les données pointées n'étaient constants. Est-ce que gcc fait vraiment ça? Cela semble incroyablement dangereux. –
@PP: Supposons que votre 'word' ne soit pas passé à l'intérieur de la boucle (ou seulement transmis à une fonction prenant' char const * '), et votre code est présumé unique, et qu'il n'y a aucun alias impliqué (soit parce que la fonction est unaire, ou parce que le pointeur est déclaré 'restricted'). Dans ce cas, je dirais que c'est une hypothèse assez sûre que les données ne changeront pas. –