如果我在WindowProc覆盖MFC窗口/视图类中使用try / catch,则会有性能损失。为什么会这样?又有什么选择?
这是我在剖析中捕获到的。删除块会使功能消耗更少的时间。我正在使用MS VS 2008。
答案 0 :(得分:2)
只使用try / catch不会产生性能损失 - 也许你会抛出太多异常?您是否已分析过您的代码以找出性能影响的来源?
答案 1 :(得分:1)
在usage-of-try-catch-blocks-in-c中,Todd Gardner解释说,编译器使用“表”方法或“代码”方法来实现异常。 “代码”方法解释了性能损失。
答案 2 :(得分:1)
另一种方法是将try-catch放在你自己的代码周围。对WndProc的大多数调用都以DefaultWindowProc *结束,而不会抛出C ++异常。因此,通过将try / catch移近您自己的代码,可以节省大量开销。
[*] DefaultWindowProc可能抛出SEH异常,例如增加堆栈,但你不应该处理它们。
答案 3 :(得分:0)
我确信你知道WindowProc会处理很多流量。每个通过泵的消息都会执行开关(消息)循环之外的任何代码。
我刚刚创建了一个基于MFC应用程序的小对话框,我在其中覆盖了WindowProc并简单地计算它被调用的次数。测试表明,只需将鼠标光标移动到对话框上,每秒就会产生超过1000个WindowProc调用。
只需要考虑一下。
P.S。我会将此添加为评论,但我还没有足够的声誉评分。
答案 4 :(得分:0)
在您的app类中,请查看覆盖CWinApp::ProcessWndProcException
。这使您有机会在任何命令或消息处理程序中引发未被捕获的MFC CException
s(和衍生物)。
如果你需要最后一次机会,你需要考虑安装自己的SEH过滤器。