LLVM/Clang被认为是很好的C代码库。我想知道为什么C异常在它们中根本没有使用?内存是使用类似池的东西来管理的,错误是用返回值和代码来报告的,就像C中一样。它们甚至将operator new Package 成placement new,当没有内存时返回error而不是exception。你知道为什么LLVM的哲学是不使用C++异常,而大多数书都建议使用它们吗?
w3nuxt5m1#
Chris Lattner最近在LLVM项目编码标准中澄清了这个问题。不使用异常和RTTI可以减少可执行文件的大小并减少开销。(你可能会说,零成本异常除非抛出,否则没有开销。至少,它们实际上将代码分解为更小的基本块并抑制某些类型的代码移动。)
rlcwz9us2#
编写异常安全的c++代码是一项艰巨的任务。关闭异常可以speed up code execution and reduce code size。“也许……这是有关系的。
mbyulnm03#
根据编译器和代码的不同,使用异常的程序可能比禁用和不使用异常的等效程序更快或更慢。使用异常的程序可能更大或更小。每个错误处理策略都会产生一些成本,我希望LLVM开发人员考虑他们的情况,并发现禁用异常是LLVM更好的决策。我的建议,以及我从Maven那里看到的最多的建议,是使用异常来报告失败,除非你有一些特定的,可靠的理由不这样做。如果你的理由是性能,那么基于分析来选择是明智的。记住,将使用异常的代码与不使用异常的代码进行比较是至关重要的,* 但仍然正确地处理错误 *。
zpgglvta4#
我认为这源于另一个准则:自由使用assert
assert
我会说assert是一个更难的例外:你绝对不能忽视它,)
ehxuflar5#
大多数书都推荐使用异常吗?我知道大多数关于C++编程的书都介绍了它们,因为它们是语言的一部分,但我不认为我见过一本书说更喜欢它们而不是错误代码或其他错误处理方法。事实上,我会说大多数书都含蓄地不推荐使用异常,因为它们没有介绍如何编写好的异常安全代码。就LLVM是好代码而不是基于异常的代码而言,这两个概念基本上是正交的。代码可以干净地编写,可以有异常也可以没有异常。
xjreopfe6#
看来这不是一个llvm哲学,以避免异常。至少我发现在编码标准(http://llvm.org/docs/CodingStandards.html)中没有关于异常的内容,所以这取决于开发人员。为什么它没有被广泛使用?到目前为止,AFAIK异常支持还没有在llvm中实现,所以不可能为llvm本身编译llvm:).所以避免异常可能只是历史原因。
6条答案
按热度按时间w3nuxt5m1#
Chris Lattner最近在LLVM项目编码标准中澄清了这个问题。
不使用异常和RTTI可以减少可执行文件的大小并减少开销。(你可能会说,零成本异常除非抛出,否则没有开销。至少,它们实际上将代码分解为更小的基本块并抑制某些类型的代码移动。)
rlcwz9us2#
编写异常安全的c++代码是一项艰巨的任务。
关闭异常可以speed up code execution and reduce code size。
“也许……这是有关系的。
mbyulnm03#
根据编译器和代码的不同,使用异常的程序可能比禁用和不使用异常的等效程序更快或更慢。使用异常的程序可能更大或更小。
每个错误处理策略都会产生一些成本,我希望LLVM开发人员考虑他们的情况,并发现禁用异常是LLVM更好的决策。
我的建议,以及我从Maven那里看到的最多的建议,是使用异常来报告失败,除非你有一些特定的,可靠的理由不这样做。如果你的理由是性能,那么基于分析来选择是明智的。记住,将使用异常的代码与不使用异常的代码进行比较是至关重要的,* 但仍然正确地处理错误 *。
zpgglvta4#
我认为这源于另一个准则:自由使用assert
assert
处理。我会说
assert
是一个更难的例外:你绝对不能忽视它,)ehxuflar5#
大多数书都推荐使用异常吗?我知道大多数关于C++编程的书都介绍了它们,因为它们是语言的一部分,但我不认为我见过一本书说更喜欢它们而不是错误代码或其他错误处理方法。事实上,我会说大多数书都含蓄地不推荐使用异常,因为它们没有介绍如何编写好的异常安全代码。
就LLVM是好代码而不是基于异常的代码而言,这两个概念基本上是正交的。代码可以干净地编写,可以有异常也可以没有异常。
xjreopfe6#
看来这不是一个llvm哲学,以避免异常。至少我发现在编码标准(http://llvm.org/docs/CodingStandards.html)中没有关于异常的内容,所以这取决于开发人员。
为什么它没有被广泛使用?到目前为止,AFAIK异常支持还没有在llvm中实现,所以不可能为llvm本身编译llvm:).所以避免异常可能只是历史原因。