为什么这个调用纯函数的字符串文字参数没有优化为常量值?

Jul*_*ius 9 c gcc clang compiler-optimization c11

我有一个简单的函数,它计算字符串中的字母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"));
}
Run Code Online (Sandbox Code Playgroud)

这是我期待的优化:

int main() {
    printf("%i", 2);
}
Run Code Online (Sandbox Code Playgroud)

为什么这个简单的功能没有像我在gcc和clang中预期的那样优化?(godbolt)

到目前为止我想到了什么:

  • 具有整数指针参数的简单函数被优化为常量(godbolt)
  • 使用带有constexpr的C++可实现此优化(godbolt)
  • 如果没有(godbolt)++t之后没有,Clang能够做这样的优化if

小智 1

因为您通过修改指针来产生副作用。

如果t您不简单地使用普通索引 int 并增加它,而不是递增,那么 gcc 可以按照您的意愿对其进行优化。

修改指针有副作用。

另一种方法是,简单地复制指针并修改该副本。它再次优化。

  • 您能否提供一个 Godbolt 链接来演示“复制该点,然后修改该副本”以这种方式优化?我无法重现这一点。 (2认同)