28

llvm/clang 被认为是良好的 C++ 代码库。我想知道为什么根本不使用 C++ 异常?

内存是使用池之类的东西来管理的,错误会通过返回值和代码来报告,就像在 C 中一样。它们甚至将 operator new 包装为放置 new,当没有内存时返回错误而不是异常。

当大多数书籍推荐使用 C++ 异常时,你知道为什么 llvm 哲学不使用 C++ 异常吗?

4

6 回答 6

20

Chris Lattner 最近在 LLVM 项目编码标准中阐明了这个问题。

不使用异常和 RTTI 会减少可执行文件的大小并减少开销。(您可能会争辩说,零成本异常没有开销,除非被抛出。至少,它们实际上将代码分解为更小的基本块并抑制某些类型的代码运动。)

于 2010-12-01T18:33:47.037 回答
6

编写异常安全的 C++ 代码是一项艰巨的任务。

关闭异常可以加快代码执行速度并减少代码大小

也许这有关系。

于 2010-11-02T21:41:43.027 回答
5

根据您的编译器和代码,使用异常的程序可能比禁用和不使用异常的等效程序更快或更慢。此外,使用异常的那个可能更大或更小。

每个错误处理策略都会产生一些成本,我希望 LLVM 开发人员考虑他们的情况并发现禁用异常是 LLVM 更好的决定。

我的建议,也是我从专家那里看到的最多的建议,是使用异常来报告失败,除非你有一些具体的、充分的理由不这样做。如果您的原因是性能,那么将您的选择基于分析是明智的。请记住,将使用异常的代码与不使用异常但仍能正确处理错误的代码进行比较至关重要。

于 2012-06-12T19:41:17.107 回答
2

我认为这源于另一个准则:自由使用断言

  • 使用错误代码处理正常错误情况。
  • 异常错误情况通过assert.

我会说 anassert是一个更难的例外:你绝对不能忽视它;)

于 2010-11-04T15:57:30.900 回答
0

大多数书籍都推荐使用它们吗?我知道大多数关于 C++ 编程的书籍都涵盖了它们,因为它们是该语言的一部分,但我认为我没有看过一本书说更喜欢它们而不是错误代码或其他错误处理方法。事实上,我会说大多数书籍都隐含地不推荐使用异常,因为它们没有涵盖如何编写好的异常安全代码。

至于 LLVM 是好的代码并且它不是基于异常的代码,这两个概念在很大程度上是正交的。代码可以干净地编写,有或没有例外。

于 2010-11-02T18:35:22.587 回答
0

似乎避免异常不是 llvm 哲学。至少我在编码标准(http://llvm.org/docs/CodingStandards.html)中没有发现任何异常,所以这取决于开发人员。

为什么它没有被广泛使用?到目前为止,在 llvm 中实现了 AFAIK 异常支持,因此无法为 llvm 本身编译 llvm :)。因此,避免例外可能只是一个历史原因。

于 2010-11-02T18:46:10.470 回答