c++ - 我可以有一个异常的静态全局实例吗?

标签 c++ c++11 exception static global-variables

我在一些地方读到过,引发异常的代价可能很高。我有一个异常(exception),我希望它会以一定的频率发生,我每次都会捕获它。这可能是一个天真的问题(像许多人一样,我迟到了异常游戏):

我能否创建一个我的异常的静态全局实例,并在它出现时抛出它(仅来自一个方法),每次都捕获它?

这甚至可以节省我的时间吗?或者因为我希望以某种频率抛出,只会从这个方法中抛出这个异常(目前),并且总是会捕获这个异常,这是否表明我应该使用其他范例来处理这种情况?

感谢任何有帮助的回答!

最佳答案

异常是按值抛出的,而不是按引用抛出的,所以简单地手头有一个异常类的实例是无济于事的。

但是,有可能 rethrow_exception (它需要一个 exception_ptr 作为参数)可能更有效,在某些给定系统上使用一些给定的编译器和选项。您必须测量才能确定这一点。

值得注意的是,对于大多数(全部?)C++ 实现,异常机制针对很少抛出异常的代码进行了优化。因此,执行通过 try block 等大部分是免费的,没有成本。但是 throw 的 Action 可能代价高昂。所以是的,如果可以的话,无论任务是什么,都要考虑一些其他的“范例”。例如,您可能会返回一个 1 boost::optional<T> ,就像一个盒子,要么包含一个对象,要么什么都不包含。


<支持> 1 如果你想避免对 Boost 的依赖,那么一个 Optional POD 类型的类实现起来很简单,对于非 POD,可以利用 std::vector作为对象载体,以可能的动态分配为代价。

关于c++ - 我可以有一个异常的静态全局实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35121946/

相关文章:

c++ - SDL 纹理透明背景

python - 如何在 Linux 中截取屏幕截图(高 fps)(编程)

c++ - 如何分析内存使用情况?

c++ - 在预编译单元中定义宏条件语句是否明智?

c++ - 为什么 std::map 没有 insert(key &, value & v) 类型的插入函数

django - 是否应该捕获来自 HTTP 参数问题的不可恢复异常?

java - 当我使用泛型方法时抛出类转换异常

c++ - 类 : where to specify it? 函数的默认模板参数

c++11 聚合初始化之前的值初始化

java - 为什么说: "Checked exceptions are not forwarded in calling chain (propagated)"?