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

use*_*783 1 c++ stl exception-handling exception llvm

根据LLVM编码标准,"LLVM不使用[...]例外".但是,LLVM确实使用了C++的标准容器,例如std::vector.

LLVM如何在没有例外的情况下使用标准容器?它如何处理容器正常情况throw?例如,如果std::vector::push_back无法分配内存会发生什么情况throw std::bad_alloc呢?

Cha*_*uth 5

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

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

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

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