2010-01-12 4 views

Répondre

27

Cela dépend de l'implémentation. Habituellement, il est appelé à chaque fois, mais, si le compilateur peut voir que word ne change jamais, et que strlen est une fonction pure (pas d'effets secondaires), il peut lever l'appel.

Voir: http://underhanded.xcott.com/?page_id=15 pour un exemple bien connu de ceci étant exploité. :-)

+0

C'est la bonne réponse ... en effet, cela dépend à quel point le compilateur est intelligent. – Noldorin

+0

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. –

+0

@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. –

8

Il sera évalué pour chaque itération de la boucle (edit: si nécessaire). Comme Tatu l'a dit, si word ne va pas changer de longueur, vous pouvez appeler strlen avant la boucle for. Mais comme Chris l'a dit, le compilateur peut être assez bon pour réaliser que word ne peut pas changer, et éliminer les appels en double lui-même.

Mais si word peut changer de longueur pendant la boucle, puis bien sûr, vous aurez besoin de garder l'appel strlen dans la condition de la boucle.

+1

en fait, la plupart des compilateurs devraient optimiser cela tant que 'word' n'est pas modifié dans le corps de la boucle ou déclaré comme' volatile'; comme toujours, vous pouvez vérifier le (dés) assemblage pour voir ce qui se passe ... – Christoph

+0

Bah, c'est loin d'être la réponse complète. Si le compilateur est à moitié correct, il devrait vraiment optimiser l'appel de sorte qu'il n'est évalué qu'une seule fois. – Noldorin

+0

C'est vrai, un compilateur peut être assez intelligent pour optimiser et éviter un appel à chaque fois. –

0

strlen vérifie la longueur de la corde fournie. Ce qui signifie que si la longueur est de 10. Votre itération continuera tant que i est inférieur à 10.

Et dans ce cas. 10 fois.

Read more about loops

+0

-1 parce que la chaîne peut être modifiée dans la boucle et donc 'strlen' pourrait être appelé un nombre infini de fois (en supposant que le compilateur ne cache pas le résultat de' strlen() '). –

+0

De plus, il n'y avait aucune garantie dans l'exemple que 'i' ne soit pas modifié non plus. –

+0

C'est une raison stupide de voter en bas. En supposant qu'il ne modifie pas la chaîne. C'était plus une explication très basique de ce que cela donnerait au premier coup d'oeil et ensuite une référence comment les boucles fonctionnent. –

6

Je vais le code parfois comme ...

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

... de sorte que strlen est appelée une seule fois (pour améliorer les performances).

0

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

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

Le nombre de fois strlen(word) est exécuté dépend:

  1. Si word est déclarée comme constante (les données est constante)
  2. 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.

+3

A 'pointeur const' qualifié est seulement une promesse que le ne sera pas pointée modifié via cette variable spécifique (sans coulée), pas que les données lui-même est immuable. – jamesdlin

Questions connexes