• 转载
  • 后端开发
  • C++核心指南:P.9 不要浪费时间和空间

    2020.02.12 16:36发布

    6132人阅读

    0人评论

    原因


    这是 C++.


    注意


    为了实现目标而花费的时间和空间(如,开发速度、资源安全性或测试的简化)不是浪费,”追求效率的另一个好处是,这个过程迫使你更深入地理解问题“ -- Alex Stepanov。


    糟糕的例子


    struct X {
    char ch;
    int i;
    string s;
    char ch2;
    X& operator=(const X& a);
    X(const X&);
    };
    X waste(const char* p)
    {
    if (!p) throw Nullptr_error{};
    int n = strlen(p);
    auto buf = new char[n];
    if (!buf) throw Allocation_error{};
    for (int i = 0; i < n; ++i) buf[i] = p[i];
    // ... 操作 buffer ...
    X x;
    x.ch = 'a';
    x.s = string(n); // 为*p而分配的x.s空间
    for (gsl::index i = 0; i < x.s.size(); ++i) x.s[i] = buf[i]; // 将buf拷贝到x.s
    delete[] buf;
    return x;
    }
    void driver()
    {
    X x = waste("Typical argument");
    // ...
    }


    是的,这只是一个夸张的描述,但是我们已经看到了生产代码中的每个错误,甚至更糟的问题。注意,X的布局至少浪费6个字节(很可能更多),虚假的复制操作定义禁用了move语义,从而使得返回操作很慢(请注意,这里不保证返回值优化RVO)。为buf而使用new和delete也是多余的,如果我们真的需要一个局部字符串,我们应该使用一个局部string。还有更多的性能bug和不必要(gratuitous)的复杂性。


    糟糕的例子


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

    是的, 这是一个生产代码的示例,我们把它留给读者去找出什么被浪费了。


    注意


    关于浪费,孤立的示例通常是不重要的,如果重要,通常也很容易被专家来消除。然而,在代码库中大量传播的浪费很容易造成严重后果,而且专家并不总是像我们希望的那样可用。这个规则(以及支持它的更具体的规则)的目的是在使用c++之前消除与之相关的大部分浪费。之后,我们可以查看与算法和需求相关的浪费,但这超出了本指南的范围。


    实施


    许多更具体的规则旨在实现简化和消除不必要浪费的总体目标。




    • 从用户定义的非默认后缀operator++或operator--函数中标记一个未使用的返回值,优先使用前缀形式(注:“用户自定义非默认值”是为了减少噪音。如果在实践中仍然过于嘈杂,请重新审视这一措施。)




    文章来源于网络,版权归原作者所有,内容为作者个人观点,文章仅供学习,如有侵权请联系客服删除,本站拥有对此声明的最终解释权。

  • C++
  • 举报文章

  • 收藏博客:

  • 分享至:
  • 添加评论

    请先登录再评论...

    登录

    评论列表(条评论)

    没有更多评论了