C 在按索引访问元素时增加字符指针是否会提高性能?

C 在按索引访问元素时增加字符指针是否会提高性能?,c,C,我正在刷新我的“C”知识。我知道数组会衰减到指针,以及它是如何工作的。在字符串处理中,我一直在运行类似这样的代码 int count_spaces(const char *s) { int count = 0; for(; *s != '\0'; s++){ if(*s == ' '){ count++; } } return count; } 我从字符串处理代码中获得了什么性能增益,而不是像这样编写函数 i

我正在刷新我的“C”知识。我知道数组会衰减到指针,以及它是如何工作的。在字符串处理中,我一直在运行类似这样的代码

int count_spaces(const char *s)
{
    int count = 0;

    for(; *s != '\0'; s++){
        if(*s == ' '){
            count++;
        }
    }

return count;

}
我从字符串处理代码中获得了什么性能增益,而不是像这样编写函数

int count_spaces(const char s[])
{
    int count = 0, i;

    for(i = 0; s[i] != '\0'; i++)
    {
        if(s[i] == ' '){
            count++;
        }
    }
return count;

}

关于何时使用指针和何时不使用指针,是否有一个简单的词汇表可以供参考?

这取决于编译器。某些编译器可能会为一种或另一种方法提供性能增益

然而,看一个具体的例子可能是有用的。使用
gcc-S-O0
,我的机器上最低优化的汇编输出为第一个函数提供了比第二个函数多3个指令

但是使用
-O3
标志,它们被优化为相同的部件文件

编辑:另请参见使代码尽可能可读并抵抗不幸错误的括号:)

编辑:


为了清楚地回答您的问题:使用您和任何可能阅读您的代码的人最清楚的选项。与可读性和意图清晰性相比,您可能获得的性能提升微不足道。让编译器从代码中挤出这种性能

您是否尝试检查asm版本?@Ultrasoner您有一个小的语法错误。在第二个代码示例中,需要在\0之后添加一个额外的单引号。另外,缺少重要的括号@DylanKirkby什么是重要的括号?@DylanKirkby即使是正确的格式也可以:)@DylanKirkby感谢编译器优化标志的指针。我为使用文本编辑器编写代码段而不是使用适当的带格式的编辑器而付出了代价。现在修复。同意关于清晰性的评论。如果性能非常关键,则此函数将在不进行分支的情况下编写,并可能使用SIMD指令进行矢量化。只有当输入
s
是一个很长的字符串时,这才有意义。
int count_spaces(const char s[]) {
    int count = 0, i;

    for(i = 0; s[i] != '\0'; i++) {
        if(s[i] == ' ') {
            count ++;
        }
    }
    return count;
}