Будет strlen (), функция ниже вызвана только однажды (со значением, сохраненным для дальнейших сравнений); или будет им, звонил каждый раз, когда сравнение выполняется?
for (i = 0; i < strlen(word); i++)
{ /* do stuff */ }
, который зависит от реализации. Обычно он вызывается каждый раз, но, если компилятор может видеть, что Word
Никогда не меняется, и что strlen
- это чистая функция (без побочных эффектов), она может поднять вызов Отказ
См.: http://underhanded.xcott.com/?page_id=15 для хорошо известного примера этого использования этого эксплуатации. : -)
Это будет оцениваться для каждой итерации петли ( редактирование: при необходимости ).
Как сказал Тату, если Word
не будет изменяться в длину, вы можете сделать вызов STRLEN
перед циклом для цикла. Но, как сказал Крис, компилятор может быть достаточно хорошим, чтобы понять, что Word
не может измениться, и устранить дубликат сам.
Но если слово
может изменяться в длину во время цикла, то, конечно, вам нужно будет сохранить вызов
в условиях цикла.
strlen проверяет долю данной строки. Это означает, что если длина 10 - 10. Ваша итерация будет продолжать идти до тех пор, пока я ниже 10.
и в этом случае. 10 раз.
Это будет призвано для каждой итерации. Следующий код вызывает только функцию rllen один раз.
for (i = 0, j = strlen(word); i < j i++)
{ /* do stuff */ }
Это не будет работать, я боюсь, поскольку две лямбда-выражения (и делегаты), которые вы объявили, на самом деле разные объекты, и возвращает разные ссылки. Следовательно, удаление обработчика ( - =
) всегда будет терпеть неудачу.
Общее решение этой проблемы (где вам нужно удалить обработчик) - это просто воссоздание выражения ламба в правильный метод. Альтернативой состоит в том, чтобы поддерживать переменную класса для делегата обработчика события, и добавить и удалить это, хотя я лично не поклонник этого. (Это больше хлопот, чем просто создание нормального метода, если что-то.)
-121--1019982- Количество раз Sllen (Word)
выполняется зависит от:
Word
объявляется как постоянный (данные постоянны) Слово
не изменено. Возьмите следующий пример:
char word[256] = "Grow";
for (i = 0; i < strlen(word); ++i)
{
strcat(word, "*");
}
В этом примере переменная Word
модифицируется с циклом:
0) «расти» - длина == 4
1) «Расти *» - длина == 5
2) «Расти **» - Длина == 6
Однако компилятор может факторировать вызов
, поэтому он называется один раз, если переменная слово
Объявленные как постоянные:
void my_function(const char * word)
{
for (i = 0; i < strlen(word); ++i)
{
printf("%d) %s\n", i, word);
}
return;
}
Функция заявила, что переменное слово
является постоянным данным (фактически указатель на постоянные данные ). Таким образом, длина не изменится, поэтому компилятор может звонить только STRLEN
один раз.
Когда под сомнение, вы всегда можете выполнить оптимизацию самостоятельно, что может представить более читаемый код в этом случае.
Я иногда код, как ...
for (int i = 0, n = strlen(word); i < n; ++i) { /* do stuff */ }
... так что Стрен называется только один раз (для улучшения производительности).