Cpp核心指南在这个例子中浪费了什么?

ham*_*els 11 c++ cpp-core-guidelines

Cpp核心指南中的例子浪费了什么?

P.9:不要浪费时间或空间

[...]

void lower(zstring s)
{
    for (int i = 0; i < strlen(s); ++i) s[i] = tolower(s[i]);
}
Run Code Online (Sandbox Code Playgroud)

是的,这是生产代码中的一个例子.我们留给读者来弄清楚浪费了什么.

来自https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rp-waste

use*_*264 25

strlen在循环的每次迭代中计算.


Bri*_*ian 10

strlen 每次调用循环条件时都会调用,每次调用需要O(n)个时间,因此循环的总时间为O(n ^ 2).


For*_*Bru 7

浪费了大量时间,并且当代码的作者增加时可能会出现分段错误s,而不是i循环:

for (int i = 0; i < strlen(s); ++s)
                 //right here ^^^^
Run Code Online (Sandbox Code Playgroud)

  • 它实际上是有效的,因为`strlen(s)`将在循环中的每一轮减少,并最终到达`i`. (6认同)
  • @melpomene,有点使 `i` 作为索引变得多余,因为它的值永远不会改变:) (2认同)

Que*_*tin 5

正如其他aswers已经声明的那样,strlen(s)多次被调用,因为它处于这种状态,暗示它应该被缓存并重新使用.

strlen(s)实际上根本不需要被调用!s是(或可以隐式转换为)以nul结尾的char数组,因为这是strlen预期的.所以我们可以将这个属性用于我们自己的循环.

void lower(zstring s) {
    for (char *p = s; *p; ++p)
        *p = std::tolower((unsigned char)*p);
}
Run Code Online (Sandbox Code Playgroud)