下面的strlen()函数是否只被调用一次(存储的值用于进一步的比较); 或者每次进行比较时都会调用它?
for (i = 0; i < strlen(word); i++)
{ /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
Chr*_*ung 28
这是依赖于实现的.通常,它每次都被调用,但是,如果编译器可以看到word
永远不会改变,并且这strlen
是一个纯函数(没有副作用),它可以解除调用.
请参阅:http://underhanded.xcott.com/?page_id = 15,了解有关此漏洞的一个众所周知的示例.:-)
它将针对循环的每次迭代进行评估(编辑:如果需要).
就像Tatu说的那样,如果word
不会改变长度,你可以strlen
在for循环之前进行调用.但正如克里斯所说,编译器可能足以实现word
无法改变,并消除重复调用本身.
但是如果word
在循环期间可以改变长度,那么当然你需要将strlen
调用保持在循环条件下.
我有时会将其编码为......
for (int i = 0, n = strlen(word); i < n; ++i) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
...所以strlen只被调用一次(以提高性能).