仅当某个编译时表达式为true时,才尝试{....} catch(..)

Joh*_*itb 11 c++ optimization try-catch

这是我们正在努力做的事情

try {
    std::uninitialized_copy(...);
} catch(...) {
    if(!boost::has_trivial_destructor<T>::value) {
       // some cleanup to do here...
    }
    throw;
}
Run Code Online (Sandbox Code Playgroud)

我们想知道如果编译时间常量if为false ,try/catch是否有成本.

编译器在其"as-if"权限内是否可以删除try catch并表现为 - 如果std::uninitialized_copy调用没有出现try

或者C++规范中是否隐藏了一些需要编译器将其保留在此处的内容?作为一个例子,想象一个假设surrounding_try_blocks()函数,它返回当前围绕帧的动态周围try块计数.

rav*_*avi 0

下面我总结了使用异常的成本,这些成本是我从各种来源整理的。因为你在第二点中问的问题对我来说不太清楚。所以我认为最好还是把一切都交给你。希望你能选择一些对你来说重要的东西。

为了在运行时处理异常,程序必须进行大量的簿记工作。在执行期间的每个点,如果抛出异常,他们必须能够识别需要销毁的对象;他们必须记下 try 块的每次进入和退出;对于每个 try 块,它们必须跟踪关联的 catch 子句以及这些子句可以处理的异常类型。

即使您从不使用任何异常处理功能,也需要付出一些代价。您需要为跟踪哪些对象已完全构建所需的数据结构所使用的空间付费,并为保持这些数据结构最新所需的时间付费。这些成本通常相当适中。

然而,不支持异常编译的程序通常比支持异常编译的程序更快、更小

  • 但这并不能回答问题。“编译器能否在其“as-if”权限内删除 try catch 并表现得就像“std::uninitialized_copy”调用出现时没有“try”一样?”。换句话说,您描述的所有工作都可以消除吗,因为编译器(原则上)可以看到不需要它? (4认同)