在llvm/clang中没有按设计使用C++异常

zah*_*pov 27 c++ coding-style exception llvm clang

llvm/clang被认为是很好的C++代码库.我想知道为什么C++异常根本不用于它们?

使用类似池的内容管理内存,并使用返回值和C中的代码报告错误.它们甚至将operator new包装为placement new,返回错误,而没有内存时也不例外.

您是否知道为什么llvm哲学在大多数书籍推荐使用时不会使用C++异常?

ohm*_*ics 19

Chris Lattner最近在LLVM项目编码标准中澄清了这个问题.

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


rot*_*lup 6

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

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

也许这是相关的.

  • @rotoglup:谷歌C++风格指南确实禁止异常,但它也解释了他们不再认为这是一个好的决定,只是因为需要自由地与他们自己的遗留代码互操作而被迫进入. (13认同)
  • 编写不是异常安全的正确C++代码比仅编写异常安全代码(至少基本异常安全)要困难得多. (10认同)
  • @comonad:你错了.`goto`允许任意流(向上,向下......),而异常只允许"向下",即可以处理它们的下一个catch块.并且Stack Unwinding是有保证的.另外,既然我们在谈论C++,那么就没有最终的阻止.编写具有基本异常安全性的代码很容易,大学没有教授它,许多人不知道它是什么,但无知和困难是两个正交的概念.我同意编写强大的异常安全代码更加困难,但是用另一种机制提供相同的保证并不困难...... (9认同)
  • @ClaytonHughes异常与getos完全不同.例外就像单子.它允许您组合功能,并在更高级别捕获错误.你无法用GOTO做到这一点,特别是在无法使用GOTO的函数式编程语言中.`for`,`while`,`if`,`else`是荣耀的GOTO,但例外并不像GOTO. (5认同)
  • @Clayton:人类是猿人吗?两者之间存在太多差异,无法证明正确答复...... (4认同)
  • 我无法确定任何特定的链接,但不使用C++异常是很常见的.Google c ++样式指南还提到不使用异常.也许我有点悲观,但在处理异常时,基本的异常安全可能很快就会变得不够.虽然我不是支持或反对异常的倡导者...... (2认同)

Tod*_*eer 5

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

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

我的建议,以及我从专家那里看到的建议,是使用例外报告失败,除非你有一些特定的,坚实的理由不这样做.如果你的理由是表现,那么选择分析是明智的.请记住,将使用异常的代码与不能代码但仍能正确处理错误的代码进行比较至关重要.

  • 我读过的关于C++风格的书籍都主张用异常报告错误.这包括由Herb Sutter,Andrei Alexandrescu和Bjarne Stroustrup撰写的书籍.标准库通过使用它们来报告错误,隐式地推荐了异常.很简单,例外是报告错误的既定标准方法(尽管其他方法完全适合某些情境). (5认同)