combien de fois strlen () sera-t-il appelé dans cette boucle?

La fonction strlen () ci-dessous sera-t-elle appelée une seule fois (avec la valeur stockée pour des comparaisons ultérieures); ou sera-t-il appelé à chaque fois que la comparaison est effectuée?

for (i = 0; i < strlen(word); i++) { /* do stuff */ } 

Cela dépend de la mise en œuvre. Il est généralement appelé à chaque fois, mais si le compilateur peut voir que le word ne change jamais et que strlen est une fonction pure (aucun effet secondaire), il peut lever l’appel.

Voir: http://underhanded.xcott.com/?page_id=15 pour un exemple connu d’exploitation de cette situation. 🙂

Il sera évalué à chaque itération de la boucle ( édition: si nécessaire ).

Comme Tatu l’a dit, si le word ne va pas changer de longueur, vous pouvez faire l’appel strlen avant la boucle for. Mais comme Chris l’a dit, le compilateur peut être assez bon pour se rendre compte que le word ne peut pas changer et éliminer les appels en double.

Mais si la longueur du word peut changer pendant la boucle, vous devrez bien sûr garder l’appel strlen dans la condition de boucle.

Je vais parfois le coder comme …

 for (int i = 0, n = strlen(word); i < n; ++i) { /* do stuff */ } 

... de sorte que strlen n'est appelé qu'une fois (pour améliorer les performances).

Le nombre d’exécutions de strlen(word) dépend de:

  1. Si le word est déclaré constant (les données sont constantes)
  2. Ou le compilateur peut détecter que ce word n’est pas modifié.

Prenons l’exemple suivant:

 char word[256] = "Grow"; for (i = 0; i < strlen(word); ++i) { strcat(word, "*"); } 

Dans cet exemple, le word variable est modifié avec la boucle:
0) "Grandir" - longueur == 4
1) "Grow *" - longueur == 5
2) "Grow **" - longueur == 6

Cependant, le compilateur peut exclure l'appel strlen , il est donc appelé une fois, si le word variable est déclaré comme constant:

 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 le word variable est une donnée constante (en fait, un pointeur sur une donnée constante ). Ainsi, la longueur ne changera pas et le compilateur ne pourra appeler strlen qu'une seule fois.

En cas de doute, vous pouvez toujours effectuer l'optimisation vous-même, ce qui peut présenter un code plus lisible dans ce cas.

strlen vérifie la longueur de la chaîne fournie. Ce qui signifie que si la longueur est de 10. Votre itération continuera tant que j’ai moins de 10.

Et dans ce cas. 10 fois.

En savoir plus sur les boucles

Il sera appelé à chaque itération. Le code suivant appelle la fonction strlen une seule fois.

 for (i = 0, j = strlen(word); i < j i++) { /* do stuff */ }