在没有命中时,尝试C中的catch是否会影响性能

我有代码,其中函数中有try catch,函数被命中. 100次.代码每次都会提前返回,而不会实际触及try catch.这是否会影响Visual Studio的性能.我看到了性能影响.

我的代码是:

void foo(int a) {
 if (a > value) {
    return;
 }
 try {
    possibleErrorFunction();
 } catch {
 }
}

我改成了:

void foo(int a) {
if (a > value) {
    return;
}
bar();
}

void bar() {
try {
    possibleErrorFunction();
} catch {
}
}

第二个代码似乎快了大约10秒.对此有任何可以解释的解释吗?

最佳答案 异常机制实现中使用了两个主要策略.一个是所谓的“基于帧”或“动态”,另一个是“基于表格”.其他方案是这两者的变体.你可以阅读更多关于他们
here

本质上,“基于帧”的动态实现确实在运行时将每个条目的资源花费在try块上和从try块中退出.如果不抛出异常但是它使用了更多的内存,那么“基于表”的机制不涉及任何额外的工作.

我不是100%肯定,但据我所知Microsoft编译直到VS2008使用“基于帧”的方法,并从VS2010开始实现“基于表”的方法. (也许有一些编译器开关可以控制它 – 我不知道,因为我个人不希望在现有代码或第三方库强制之前不使用异常).我想你可以在编译器文档中找到这些信息.

您还可以从c源生成汇编代码,以查看try块的运行情况

点赞