为什么对带有字符串文字参数的纯函数的调用未优化为恒定值?

时间:2018-12-31 15:15:12

标签: 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"));
}

这是我期望的优化:

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

为什么这个简单的函数没有像我在gcc和clang中都没有预期的那样被优化? (godbolt

到目前为止我所发现的:

  • 具有整数指针参数的简单函数已优化为常量 (godbolt
  • 将C ++与constexpr配合使用可实现此优化(godbolt
  • 如果++tgodbolt)之后没有if,Clang可以进行这种优化

1 个答案:

答案 0 :(得分:1)

因为您正在通过修改指针来创建副作用。

如果您只使用普通索引int而不是递增t而不是递增它,那么gcc便可以毫无问题地对其进行优化。

修改指针有副作用。

另一种方法,只需简单地创建指针的副本,然后修改副本。再次优化。