如果在循环条件下使用,strlen会被多次计算吗?

我不确定下面的代码是否会导致冗余计算,还是编译器特定的?

for (int i = 0; i < strlen(ss); ++i)
{
    // blabla
}

每次i增加时都会计算strlen()吗?


是的, strlen()将在每次迭代中被评估。 有可能在理想的情况下,优化器可能会推断出价值不会改变,但我个人不会依赖这一点。

我会做类似的事情

for (int i = 0, n = strlen(ss); i < n; ++i)

或可能

for (int i = 0; ss[i]; ++i)

只要字符串在迭代期间不会改变长度。 如果可能,那么你需要每次调用strlen() ,或者通过更复杂的逻辑处理它。


是的,每次你使用循环。 然后它会每次计算字符串的长度。 所以像这样使用它:

char str[30];
for ( int i = 0; str[i] != ''; i++)
{
//Something;
}

在上面的代码中, str[i]只在每次循环开始一个循环时验证位置i字符串中的一个特定字符,因此它将占用较少的内存并且效率更高。

有关更多信息,请参阅此链接。

在下面的代码中,每次循环运行时, strlen都会计算整个字符串的长度,效率较低,需要更多时间并占用更多内存。

char str[];
for ( int i = 0; i < strlen(str); i++)
{
//Something;
}

一个好的编译器可能不会每次计算它,但我不认为你可以确定每个编译器都这么做。

除此之外,编译器必须知道, strlen(ss)不会改变。 只有在for循环中没有更改ss这才是真实的。

例如,如果您使用的是只读功能上ssfor循环,但不声明ss -parameter为const ,编译器甚至不知道ss是不是在循环改变,必须计算strlen(ss)在每一次迭代。

链接地址: http://www.djcxy.com/p/85713.html

上一篇: Will strlen be calculated multiple times if used in a loop condition?

下一篇: Is Fortran easier to optimize than C for heavy calculations?