我已经读过,使用C++异常进行异常处理有一些开销,而不是检查返回值.我只是谈论没有抛出异常时产生的开销.我还假设您需要实现实际检查返回值的代码并执行相应的操作,无论它与catch块的作用相同.并且,将异常对象与内部45个状态变量抛出的代码与为每个错误返回负整数的代码进行比较也是不公平的.
我不是仅仅基于哪个可以更快地执行来构建支持或反对C++异常的情况.我听到有人最近提出这样的情况:一旦你考虑了检查返回值和处理错误所需的所有额外簿记代码,使用异常的代码应该像基于返回代码的代码一样快.我错过了什么?
我是一名学生,我对C++知之甚少,我试图扩展它.这更像是一个哲学问题.我不是想要实现某些东西.
以来
#include <new>
//...
T * t = new (std::nothrow) T();
if(t)
{
//...
}
//...
Run Code Online (Sandbox Code Playgroud)
将隐藏异常,并且因为与简单相比处理异常更重if(t),为什么不正常new T()不被认为是不太好的做法,考虑到我们将不得不try-catch()用来检查简单分配是否成功(如果我们不成功,只是看程序死了)?
new与使用nothrow new?相比,正常分配有哪些好处(如果有的话)?在这种情况下,例外的开销是微不足道的?
此外,假设分配失败(例如,系统中不存在内存).程序在那种情况下可以做什么,或者只是优雅地失败.当保留所有内存时,无法在堆上找到空闲内存吗?
如果分配失败,并且a std::bad_alloc为thrown,我们如何假设由于没有足够的内存来分配对象(例如a new int),将有足够的内存来存储异常?
谢谢你的时间.我希望这个问题符合规则.
某处我已阅读,现代的Intel处理器具有低级别的硬件实现异常和大多数编译器利用它,到例外变得比使用返回变量结果状态较快的影响.
这是真的吗?就返回状态/响应状态而言,是否比变量更快?读取堆栈溢出的话题似乎与此相矛盾.
谢谢
毫无疑问,异常是有用的,因为它们向程序员显示他正在使用不正确的函数或者在环境中发生了一些不好的事情但是真的需要捕获它们吗?
未捕获的异常正在终止程序,但您仍然可以看到问题所在.在设计良好的库中,每个"意外"情况实际上都有解决方法.例如,使用map::find而不是map::at检查你的int变量是否小于vector::size使用索引运算符之前的变量.
为什么有人需要这样做(不包括使用强制执行它的库的人)?基本上,如果您正在为给定的异常编写处理程序,那么您也可以编写一个代码来防止它发生.