我不确定下面的代码是否会导致冗余计算,或者它是特定于编译器的?
for (int i = 0; i < strlen(ss); ++i)
{
// blabla
}
每次i
增加都会计算strlen()
吗?
发布于 2012-07-06 23:24:32
是的,strlen()
将在每次迭代中进行评估。在理想情况下,优化器可能能够推断出值不会改变,但我个人不会依赖这一点。
我会做像这样的事情
for (int i = 0, n = strlen(ss); i < n; ++i)
或者有可能
for (int i = 0; ss[i]; ++i)
只要字符串在迭代过程中不会改变长度。如果可能,那么您需要每次都调用strlen()
,或者通过更复杂的逻辑来处理它。
发布于 2012-07-06 23:31:10
是的,每次你使用循环的时候。然后它每次都会计算字符串的长度。所以像这样使用它:
char str[30];
for ( int i = 0; str[i] != '\0'; i++)
{
//Something;
}
在上面的代码中,每次循环开始时,str[i]
只在位置i
处验证字符串中的一个特定字符,因此它占用的内存更少,效率更高。
有关详细信息,请参阅此Link。
在下面的代码中,每次循环运行时,strlen
都会计算整个字符串的长度,这会降低效率,耗费更多的时间和内存。
char str[];
for ( int i = 0; i < strlen(str); i++)
{
//Something;
}
发布于 2012-07-06 23:23:27
一个好的编译器可能不会每次都计算它,但我不认为你可以肯定,每个编译器都会计算它。
除此之外,编译器必须知道,strlen(ss)
不会改变。只有当for
循环中的ss
未更改时,才会出现这种情况。
例如,如果在for
循环中对ss
使用只读函数,但没有将ss
-parameter声明为const
,编译器甚至无法知道ss
在循环中没有变化,并且必须在每次迭代中计算strlen(ss)
。
https://stackoverflow.com/questions/11365039
复制相似问题