Die Anzahl der strlen(word)
ausgeführt wird, ist abhängig von:
- Wenn
word
als Konstante deklariert wird (die Daten konstant ist)
- oder der Compiler kann erkennen, dass
word
nicht geändert wird.
Nehmen wir folgendes Beispiel:
char word[256] = "Grow";
for (i = 0; i < strlen(word); ++i)
{
strcat(word, "*");
}
In diesem Beispiel wird die Variable word
withing der Schleife modifiziert:
0) "wachsen" - Länge == 4
1) „Wachsen *“- Länge == 5
2) "wachsen **" - Länge == 6
Allerdings kann der Compiler den strlen
Aufruf ausklammern, so wird es einmal aufgerufen, wenn der varia ble word
als konstant deklariert ist:
void my_function(const char * word)
{
for (i = 0; i < strlen(word); ++i)
{
printf("%d) %s\n", i, word);
}
return;
}
Die Funktion hat erklärt, dass die Variable word
konstante Daten ist (tatsächlich ein Zeiger auf konstante Daten). Daher ändert sich die Länge nicht, so dass der Compiler strlen
nur einmal aufrufen kann.
Im Zweifelsfall können Sie die Optimierung immer selbst durchführen, was in diesem Fall mehr lesbaren Code darstellt.
Das ist die richtige Antwort ... tatsächlich hängt es davon ab, wie clever der Compiler ist. – Noldorin
Im Beispiel wurde dies mit einem 'char *' gemacht, was bedeutet, dass weder der Zeiger noch die Daten konstant waren. Macht gcc das wirklich? Es scheint unglaublich gefährlich zu sein. –
@PP: Angenommen, Ihr 'Wort' wird nirgendwo anders innerhalb der Schleife übergeben (oder nur an eine Funktion übergeben, die' char const * '), und Ihr Code wird als single-threaded angesehen, und es ist kein Aliasing beteiligt weil die Funktion unary ist, oder weil der Zeiger als "restricted" deklariert ist. In diesem Fall würde ich sagen, dass es eine ziemlich sichere Annahme ist, dass sich die Daten nicht ändern werden. –