关于C(不是C ++)在比较语句中做数学有助于或损害效率吗?那么声明指针呢?

时间:2017-07-06 23:24:18

标签: c pointers math comparison

由于人们似乎无法阅读,我正在编辑这个问题,并辩论删除。我简化了代码,代表了一些逻辑,我正在大型和非常古老的项目中进行优化。我要求他们不要过多关注代码,就像C编码的概念一样......我不得不使用代码来提问,因为我不确定如何正确地说出来。

关于C(不是C ++)在比较语句中做数学有助于或损害效率吗?指针声明怎么样? SORRY无法提供代码示例,因为在我得到答案之前,语法会被挑剔到地狱。

1 个答案:

答案 0 :(得分:2)

在比较之前执行表达式结果之间的比较或将值存储到局部变量中通常不会产生很大的差异,除非可以避免计算。这是一个典型的例子:

int count_char(const char *s, char c) {
    int count = 0;
    for (int i = 0; i < strlen(s); i++) {
        if (s[i] == c)
           count++;
    }
    return count;
}

计算每次迭代的字符串长度效率非常低。在循环初始阶段计算一次更好:

int count_char(const char *s, char c) {
    int count = 0;
    for (int i = 0, len = strlen(s); i < len; i++) {
        if (s[i] == c)
           count++;
    }
    return count;
}

然而,使用指针的不同方法(如您的问题中所述)可能会更有效:

int count_char(const char *s, char c) {
    int count = 0;
    while (*s) {
        if (*s++ == c)
           count++;
    }
    return count;
}

这是一个更严格的版本,虽然不太可读:

int count_char(const char *s, char c) {
    int count = 0;
    while (*s) {
        count += (*s++ == c);
    }
    return count;
}

请注意,对于size_tinti变量,上述所有函数都应使用len而不是count,因为在某些平台上,字符串的长度可能大于int类型的最大值。

另请注意,非常好的优化编译器可以为所有版本生成类似且有效的代码,因为strlen()是纯函数,并且s的内容可以确定在执行期间保持不变函数,但对于更复杂的例子来说并不一定正确。