Cpp核心指南中的示例浪费了什么?
P.9:不要浪费时间或空间
[...]
void lower(zstring s) { for (int i = 0; i < strlen(s); ++i) s[i] = tolower(s[i]); }
是的,这是生产代码中的一个示例。我们留给读者去弄清楚是什么浪费了。
来自https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rp-waste
答案 0 :(得分:24)
strlen在循环的每次迭代中计算。
答案 1 :(得分:9)
strlen
,每次调用需要O(n)次,因此循环的总时间为O(n ^ 2)。
答案 2 :(得分:7)
由于代码的作者在循环中增加s
而不是i
,因此浪费了大量时间并且可能发生分段错误:
for (int i = 0; i < strlen(s); ++s)
//right here ^^^^
答案 3 :(得分:5)
正如其他aswers已经说过的那样,=VALUE
被多次调用,因为它处于这种状态,暗示它应该被缓存并重新使用。
但实际上根本不需要调用strlen(s)
! strlen(s)
是(或可隐式转换为)以nul结尾的s
数组,因为这是char
所期望的。所以我们可以将这个属性用于我们自己的循环。
strlen
答案 4 :(得分:0)
除非它们在zstring
类中具有非常不直观的语义,否则当前形式的函数完全浪费了时间和空间,因为其“结果”不能在函数之后使用-它作为值传递,并且不返回。
因此,为了避免浪费时间无用地计算不能使用的小写字母以及复制传递的参数中的空间,我将按引用传递!