LLVM如何在没有例外的情况下使用C ++的标准容器?

时间:2016-07-30 12:07:42

标签: c++ exception exception-handling stl llvm

根据LLVM Coding Standards,“LLVM不使用[...]例外”。但是,LLVM确实使用了C ++的标准容器,例如px

LLVM如何在没有例外的情况下使用标准容器?它如何处理容器通常std::vector的情况?例如,如果throw无法分配内存且无法std::vector::push_back

,会发生什么情况

2 个答案:

答案 0 :(得分:5)

LLVM会将某个异常事件视为立即崩溃。如果使用的实现/编译设置启用了异常,则会抛出一个unwind并找不到catch处理程序并调用std::terminate。如果实现/编译设置禁用异常,则实现必须提供一些替代行为。大多数人会以这种或那种方式立即崩溃。

LLVM上的开发人员使用这些设置测试他们的代码,并小心避免可能发生的情况。

一种无法直接避免的情况是分配失败。 LLVM根本不支持分配可能失败且用户必须捕获bad_alloc的平台。如果平台无法在任何时候分配内存,LLVM将崩溃。

事实证明,今天绝大多数非嵌入式平台都使用某种形式的overcommit。由于LLVM的设计性质,我们没有特别有用的机制来优雅地响应分配内存的失败。因此,它被认为是致命和不可恢复的错误,无论我们是否启用例外,我们都会在此时终止该过程。

答案 1 :(得分:1)

libc ++实现包含对_LIBCPP_NO_EXCEPTIONS的检查,这是对编译器支持异常的推断。

如果我看一下vector的具体实现,看起来条件是断言而不是抛出异常。但是,我无法对bad_alloc进行验证。

由于在给出-fno-exceptions时没有关于行为的文档,我认为应用程序崩溃了。