сколько раз будет вызываться strlen () в этом цикле for? - PullRequest
12 голосов
/ 12 января 2010

Будет ли приведенная ниже функция strlen () вызываться только один раз (со значением, сохраненным для дальнейшего сравнения); или он будет вызываться каждый раз, когда выполняется сравнение?

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

Ответы [ 6 ]

28 голосов
/ 12 января 2010

Это зависит от реализации.Обычно он вызывается каждый раз, но, если компилятор видит, что word никогда не меняется и что strlen - чистая функция (без побочных эффектов), он может отменить вызов.

См.: http://underhanded.xcott.com/?page_id=15 для известного примера использования этого.: -)

8 голосов
/ 12 января 2010

Он будет оцениваться для каждой итерации цикла ( редактировать: при необходимости ).

Как сказал Тату, если word не изменится по длине, вы можете сделать вызов strlen перед циклом for. Но, как сказал Крис, компилятор может быть достаточно хорош, чтобы понять, что word не может измениться, и устранить дублирующиеся вызовы сам.

Но если word может изменить длину во время цикла, то, конечно, вам нужно сохранить вызов strlen в состоянии цикла.

6 голосов
/ 12 января 2010

Я иногда буду кодировать это как ...

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

... так что strlen вызывается только один раз (для повышения производительности).

1 голос
/ 12 января 2010

Количество выполнений strlen(word) зависит от:

  1. Если word объявлено как константа (данные постоянны)
  2. Или компилятор может обнаружить это word не изменено.

Возьмите следующий пример:

char word[256] = "Grow";

for (i = 0; i < strlen(word); ++i)
{
  strcat(word, "*");
}

В этом примере переменная word изменяется в цикле:
0) «Расти» - длина == 4
1) "Grow *" - длина == 5
2) «Расти **» - длина == 6

Однако компилятор может выделить вызов strlen, поэтому он вызывается один раз, если переменная word объявлена ​​как константа:

void my_function(const char * word)
{
  for (i = 0; i < strlen(word); ++i)
  {
     printf("%d) %s\n", i, word);
  }
  return;
}

Функция объявила, что переменная word является постоянными данными (фактически, указатель на постоянные данные ). Таким образом, длина не изменится, поэтому компилятор может вызывать strlen только один раз.

Если вы сомневаетесь, вы всегда можете выполнить оптимизацию самостоятельно, что может привести к более читаемому коду в этом случае.

0 голосов
/ 12 января 2010

Он будет вызываться для каждой итерации. Следующий код вызывает функцию strlen только один раз.

for (i = 0, j = strlen(word); i < j i++)
{ /* do stuff */ }
0 голосов
/ 12 января 2010

strlen проверяет длину предоставленной строки.Это означает, что если длина равна 10. Ваша итерация будет продолжаться до тех пор, пока я ниже 10.

И в этом случае.10 раз.

Подробнее о петлях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...