如果在循环条件下使用,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
这才是真实的。
例如,如果您使用的是只读功能上ss
中for
循环,但不声明ss
-parameter为const
,编译器甚至不知道ss
是不是在循环改变,必须计算strlen(ss)
在每一次迭代。
上一篇: Will strlen be calculated multiple times if used in a loop condition?
下一篇: Is Fortran easier to optimize than C for heavy calculations?