ham*_*els 11 c++ cpp-core-guidelines
Cpp核心指南中的例子浪费了什么?
P.9:不要浪费时间或空间
[...]
Run Code Online (Sandbox Code Playgroud)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
浪费了大量时间,并且当代码的作者增加时可能会出现分段错误s,而不是i循环:
for (int i = 0; i < strlen(s); ++s)
//right here ^^^^
Run Code Online (Sandbox Code Playgroud)
正如其他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)