El número de veces que se ejecuta strlen(word)
depende de:
- Si
word
se declara como constante (los datos es constante)
- O el compilador puede detectar que
word
no se cambia.
Tome el ejemplo siguiente:
char word[256] = "Grow";
for (i = 0; i < strlen(word); ++i)
{
strcat(word, "*");
}
En este ejemplo, la variable word
se modifica en el canto del bucle:
0) "crecer" - longitud == 4
1) "crecer *" - longitud == 5
2) "Crecer **" - longitud == 6
Sin embargo, el compilador puede factorizar la llamada strlen
, por lo que se llama una vez, si la varia BLE word
se declara como constante:
void my_function(const char * word)
{
for (i = 0; i < strlen(word); ++i)
{
printf("%d) %s\n", i, word);
}
return;
}
La función ha declarado que la variable es word
datos constantes (en realidad, un puntero a los datos constantes). Por lo tanto, la longitud no cambiará, por lo que el compilador solo puede llamar al strlen
una vez.
En caso de duda, siempre puede realizar la optimización usted mismo, que puede presentar un código más legible en este caso.
Esta es la respuesta correcta ... de hecho, depende de cuán inteligente sea el compilador. – Noldorin
En el ejemplo proporcionado, esto se hizo en un 'char *', lo que significa que ni el puntero ni los datos apuntados eran constantes. ¿GCC realmente está haciendo esto? Parece increíblemente peligroso. –
@PP: suponga que su 'palabra' no pasa en ningún otro lugar dentro del bucle (o que solo pasa a una función que toma' char const * '), y su código se presume de subproceso único, y que no hay aliasing involucrado (tampoco porque la función es única, o porque el puntero se declara 'restringido'). En ese caso, diría que es una suposición bastante segura de que los datos no cambiarán. –