Il numero di volte strlen(word)
viene eseguita dipende:
- Se
word
è dichiarata come costante (il dato è costante)
- O il compilatore in grado di rilevare che
word
non viene modificato.
Prendiamo il seguente esempio:
char word[256] = "Grow";
for (i = 0; i < strlen(word); ++i)
{
strcat(word, "*");
}
In questo esempio, la variabile word
viene modificato withing loop:
0) "crescere" - lunghezza == 4
1) "Grow *" - lunghezza == 5
2) "Grow **" - lunghezza == 6
Tuttavia, il compilatore può scomporre la chiamata strlen
, così è chiamato una volta, se varia BLE word
è dichiarata come costante:
void my_function(const char * word)
{
for (i = 0; i < strlen(word); ++i)
{
printf("%d) %s\n", i, word);
}
return;
}
La funzione ha dichiarato che la variabile word
è dati costanti (in realtà, un puntatore a dati costanti). Quindi la lunghezza non cambierà, quindi il compilatore può chiamare solo strlen
una volta.
In caso di dubbio, è sempre possibile eseguire l'ottimizzazione autonomamente, che in questo caso potrebbe presentare un codice più leggibile.
fonte
2010-01-12 18:42:30
Questa è la risposta giusta ... anzi, dipende da quanto intelligente sia il compilatore. – Noldorin
Nell'esempio fornito ciò è stato eseguito su un 'char *' il che significa che né il puntatore né i dati puntati erano costanti. GCC sta davvero facendo questo? Sembra incredibilmente pericoloso. –
@PP: Supponiamo che il tuo 'word' non venga passato da nessun'altra parte all'interno del ciclo (o passato solo a una funzione che assume' char const * '), e il tuo codice è presunto single-threaded e che non vi è alcun aliasing perché la funzione è unaria o perché il puntatore è dichiarato 'restricted'). In tal caso, direi che è un presupposto abbastanza sicuro che i dati non cambieranno. –