dai*_*isy 108 c c++ optimization gcc strlen
我不确定以下代码是否会导致冗余计算,还是特定于编译器?
for (int i = 0; i < strlen(ss); ++i)
{
// blabla
}
Run Code Online (Sandbox Code Playgroud)
strlen()每次i增加时会计算出来吗?
Mik*_*our 135
是的,strlen()将在每次迭代时进行评估.在理想的情况下,优化者可能会推断出价值不会改变,但我个人不会依赖于此.
我会做点什么的
for (int i = 0, n = strlen(ss); i < n; ++i)
Run Code Online (Sandbox Code Playgroud)
或者可能
for (int i = 0; ss[i]; ++i)
Run Code Online (Sandbox Code Playgroud)
只要字符串在迭代期间不会改变长度.如果可能,那么你需要strlen()每次调用,或者通过更复杂的逻辑来处理它.
cod*_*TER 14
是的,每次使用循环.然后它会每次计算字符串的长度.所以像这样使用它:
char str[30];
for ( int i = 0; str[i] != '\0'; i++)
{
//Something;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码str[i]中,i每次循环开始循环时,只验证字符串中的一个特定字符,因此它将占用更少的内存并且更有效.
有关更多信息,请参阅此链接.
在每次循环运行时,下面的代码strlen将计算整个字符串的长度,效率较低,需要更多时间并占用更多内存.
char str[];
for ( int i = 0; i < strlen(str); i++)
{
//Something;
}
Run Code Online (Sandbox Code Playgroud)
一个好的编译器可能不会每次都计算它,但我认为你不能确定,每个编译器都会这样做.
除此之外,编译器必须知道,这strlen(ss)不会改变.只有ss在for循环中没有改变时才会出现这种情况.
例如,如果ss在for循环中使用只读函数但未将ss-parameter 声明为const,则编译器甚至不知道ss循环中没有更改,并且必须strlen(ss)在每次迭代中计算.