*str和*str ++

Ulr*_*ira 8 c pointers char

我有这个代码(我的strlen函数)

size_t slen(const char *str)
{
    size_t len = 0;
    while (*str)
    {
        len++;
        str++;
    }
    return len;
}
Run Code Online (Sandbox Code Playgroud)

这样做while (*str++),如下图所示,程序执行时间为大得多:

while (*str++)
{
    len++;
}
Run Code Online (Sandbox Code Playgroud)

我这样做是为了探测代码

int main()
{
    double i = 11002110;
    const char str[] = "long string here blablablablablablablabla"
    while (i--)
        slen(str);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,执行时间约为6.7秒,而在第二种情况下(使用*str++),时间约为10秒!

为什么这么大的差异?

Bla*_*iev 6

可能是因为后增量运算符(在while语句的条件中使用)涉及使用旧值保留变量的临时副本.

什么while (*str++)真正的意思是:

while (tmp = *str, ++str, tmp)
  ...
Run Code Online (Sandbox Code Playgroud)

相比之下,当您str++;在while循环体中作为单个语句编写时,它处于void上下文中,因此不会获取旧值,因为它不是必需的.

总而言之,*str++如果你有一个赋值,2个增量,并在循环的每次迭代中跳转.在另一种情况下,您只有2个增量和一个跳跃.

  • 与优秀的编译器无关. (4认同)
  • @pst:原则上,后增量总是涉及制作副本.在实践中,通常可以省略副本,但是根据编译器,语句的确切上下文以及实际可能或可能不会实现的优化设置. (2认同)