【问题标题】:C++ Exceptions not allowed不允许 C++ 异常
【发布时间】:2016-06-30 06:40:19
【问题描述】:

有什么理由不在 gcc 中使用 C++ 异常?

我们公司不允许他们这样做,但没有提供决定背后的理由。我们这些“愚蠢的人”都想不出任何理由。有什么建议吗?

【问题讨论】:

  • 在不确切知道您正在开发什么样的软件的情况下,很难说。不过,这听起来确实过于教条。也许是时候换工作了?
  • 既然你用qt标记了这个,它可能与Qt不依赖异常而只是效仿有关。
  • 感谢您的众多回答。这些应用程序是普通的桌面应用程序,既不重要也不实时。

标签: qt c++11 exception gcc


【解决方案1】:

只是猜测一些原因:

  • 许多规则已经很老了,并且是在不再成立的假设/条件下定义的。早期的异常实现有严重的性能缺陷,例如一些编译器完全禁用优化。这是过时的,今天的异常在不抛出时是零开销。投掷比必须做一些工作,因此不是免费的。不幸的是,更改规则通常非常耗时,因为它们是某些 QA 流程的一部分。

  • 嵌入式程序员通常不允许异常。首先,异常给 RTTI 带来了一些大小开销,这在嵌入式代码中也经常被禁止。其次,异常使得实时性能难以推理,因为性能难以预测。

  • Google 的编码风格没有例外规则。这里的论点是旧代码不是异常安全的,例如没有 RAII 课程。如果您在此类遗留代码中引入异常,则很可能会出现问题。但是,我强烈认为应该修复旧代码。

【讨论】:

    【解决方案2】:

    这篇文章很好地列出了关于 C++ 中异常使用的论点和反论点(关于神话)。

    Why use exceptions?

    【讨论】:

    • 所有提供的答案都很好,我选择了这个,因为链接是关于异常的官方常见问题解答,作者的分数最少。
    【解决方案3】:

    有一些相当大的应用领域通常禁止异常。嵌入式系统、主机游戏,很少使用异常,因为平台可能支持有限或不支持。

    Bjarne Stroustrup 帮助编写了 JSF 飞行器编码标准,该标准也禁止 C++ 异常。

    http://www.stroustrup.com/JSF-AV-rules.pdf

    原因在于,在响应速度对生命至关重要的情况下,异常可能会使代码变慢,以至于使用它们存在不合理的风险。或者,让推理代码的速度变得更加困难。

    【讨论】:

      【解决方案4】:

      C++ 异常实现有以下缺点:容易发生内存泄漏、缺少调用堆栈、在析构函数中抛出抛出时崩溃、“noexcept”的复杂性。 当项目中采用异常时,很容易造成内存泄漏。由于您不知道会抛出哪种方法,因此在内存管理和调整所有代码库时必须非常谨慎。这就是我在 C#、Java 和 Python 项目中使用异常而不在 C++ 中使用异常的原因。 ​

      许多 C++ 库和框架也不使用异常(例如 Qt)

      【讨论】:

        猜你喜欢
        • 2017-11-05
        • 1970-01-01
        • 2014-07-16
        • 2019-01-12
        • 2018-02-02
        • 1970-01-01
        • 2018-05-28
        • 2011-01-13
        • 1970-01-01
        相关资源
        最近更新 更多