Почему этот вызов чистой функции со строковым литеральным аргументом не оптимизирован для постоянного значения? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть простая функция, которая считает букву t в строке:

#include <stdio.h>
#include <string.h>

static int count_t_letters(const char *t) {
    int r;

    r = 0;
    while(*t) {
        if(*t == 't') {
            ++r;
        }

        ++t;
    }

    return r;
}

int main() {
    printf("%i", count_t_letters("test"));
}

вот оптимизация, которую я ожидал:

int main() {
    printf("%i", 2);
}

Почемуэта простая функция не оптимизирована, как я ожидал, ни в gcc, ни в clang?( godbolt )

Что я выяснил до сих пор:

  • Простые функции с аргументами целочисленного указателя оптимизированы до постоянной ( godbolt )
  • Использование C ++ с constexpr включает эту оптимизацию ( godbolt )
  • Clang может выполнить такую ​​оптимизацию, если после if нет ++t( Годболт )

1 Ответ

0 голосов
/ 03 января 2019

Поскольку вы создаете побочные эффекты, изменяя указатель.

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

Изменение указателя имеет побочные эффекты.

Другой способ, просто сделать копию указателя и изменить копию.Опять это оптимизирует.

...