更新时间:2022-10-23 08:27:50
TL; DR NO ,与错误代码处理相比,异常通常比非特殊路径更快。
嗯,明显的说法是比较什么?
与不处理错误相比,显然降低了性能;但性能是否缺乏正确性?我会认为它不是,所以让我们假设你的意思是与一个如果
语句检查的错误代码相比。
/ p>
This link states,
To catch exceptions we must place a portion of code under exception inspection. This is done by enclosing that portion of code in a try block. When an exceptional circumstance arises within that block, an exception is thrown that transfers the control to the exception handler. If no exception is thrown, the code continues normally and all handlers are ignored.
Does it mean that having a try block reduces performance due to the extra task of "inspection" during run time?
TL;DR NO, exceptions are usually faster on the non-exceptional path compared to error code handling.
Well, the obvious remark is compared to what ?
Compared to not handling the error, it obviously decrease performance; but is performance worth the lack of correctness ? I would argue it is not, so let us supposed that you meant compared to an error code checked with an if
statement.
In this case, it depends. There are multiple mechanisms used to implement exceptions. Actually, they can be implemented with a mechanism so close to an if
statement that they end up having the same cost (or slightly higher).
In C++ though, all major compilers (gcc introduced it in 4.x serie, MSVC uses it for 64 bits code) now use the Zero-Cost Exception Model. If you read this technical paper that Need4Sleep linked to, it is listed as the table-driven approach. The idea is that for each point of the program that may throw you register in a side-table some bits and pieces that will allow you to find the right catch clause. Honestly, it is a tad more complicated implementation-wise than the older strategies, however the Zero Cost name is derived by the fact that it is free should no exception be thrown. Contrast this to a branch misprediction on a CPU. On the other hand, when an exception is thrown, then the penalty is huge because the table is stored in a cold zone (so likely requires a round-trip to RAM or worse)... but exceptions are exceptional, right ?
To sum up, with modern C++ compilers exceptions are faster than error codes, at the cost of larger binaries (due to the static tables).