【问题标题】:What is wasted in this example from the Cpp Core Guidelines?这个例子中的 Cpp 核心指南浪费了什么?
【发布时间】:2017-03-07 23:37:30
【问题描述】:

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

【问题讨论】:

  • zstring 来自什么库?
  • for 和 ( 之间的空格。
  • @MaxZoom 它来自 GSL 或指南支持库。他们仍在努力完全指定它,但微软有一个跨平台的implementation 和working definitions 库的span 和byte 部分正在通过标准化,目标是包含在C 中++20.
  • @jaggedSpire 有意思,谢谢

标签: c++ cpp-core-guidelines


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    每次检查循环条件时都会调用strlen,每次调用需要O(n)时间,所以循环的总时间是O(n^2)。

    【讨论】:

      【解决方案3】:

      很多时间都被浪费了,可能会出现分段错误,因为代码作者在循环中增加s,而不是i:

      for (int i = 0; i < strlen(s); ++s)
                       //right here ^^^^
      

      【讨论】:

      • 好吧,我不会宣传可以保证分段错误的概念,因为这是一个 C++ 问题,而不是“每个已知存在的平台”问题 :)
      • 它确实有效,因为strlen(s) 会随着循环中的每一轮而减少,最终达到i。
      • @melpomene,有点让i 作为索引变得多余,因为它的值永远不会改变:)
      • @StoryTeller 当然,但这只是让它变得奇怪,没有错。
      • @melpomene,这很浪费(一个整数!!)。因此,按照核心准则,这很糟糕。
      【解决方案4】:

      正如其他人已经说过的那样,strlen(s) 被多次调用,因为它处于这种状态,这意味着它应该被缓存并重用。

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

      void lower(zstring s) {
          for (char *p = s; *p; ++p)
              *p = std::tolower((unsigned char)*p);
      }
      

      【讨论】:

      • @RolandIllig 好吧,所以传入一个负值字符会扩展为一个负值 int,这既不能用 unsigned char 表示,也不能用 EOF 表示。这是有道理的,修复它:)
      • 声明 p 是不是在浪费空间?你不能只用s吗?
      • @DavidThomas IMO 有点矫枉过正。把它留给优化器——对Compiler explorer 的快速测试表明生成的程序集与p 完全一样。
      【解决方案5】:

      除非它们在 zstring 类中有任何非常不直观的语义,否则当前形式的函数完全浪费时间和空间,因为它的“结果”无法使用在函数之后 - 它作为值传入,并且不返回。

      所以为了避免浪费时间无用计算不能使用的小写,以及复制传递的参数的空间,我将通过引用传递!

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 2017-12-17
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多