【问题标题】:How to get the benefits of /EHa with /EHsc, on a particular function?如何在特定功能上通过 /EHsc 获得 /EHa 的好处?
【发布时间】:2012-08-13 23:12:25
【问题描述】:

如果我知道我的程序中的特定 extern "C" 函数(例如,RaiseException)是引发 SEH 异常的唯一函数,并且我希望它们转换为 C++ 异常,我有什么办法可以“选择性地为该函数启用“/EHa,以便将异常转换为CStructured_Exception,而不会像normally caused by /EHa一样膨胀或减慢程序的其余部分?

【问题讨论】:

  • 不,它需要在呼叫站点处于活动状态。提供证据证明这两条 cpu 指令真的会减慢您的代码速度。早就淘汰了。现在的“天哪,烂泥”是一场没有功劳的钓鱼探险。
  • @HansPassant:微软 itself 说(甚至在 VS 2012 文档中) "/EHa 可能会导致图像性能降低,因为编译器不会优化即使编译器没有看到throw"try 也一样积极地阻止,而且我认为他们这样说并没有犯错(请随时纠正我)。至于代码膨胀(没有提到),这是真实的:使用/EHa,我的可执行文件大约增加了 10-20%。我从来没有说过它“糟透了”(见鬼,至少/EHa 是可用的),我只是发现没有必要为我不使用的东西膨胀我的可执行文件。

标签: winapi visual-c++ seh structured-exception


【解决方案1】:

显然没有编译器选项可以做到这一点。也许:

void RaiseException() {
   __try {
      // do something that might throw here...
   }

   __except(EXCEPTION_EXECUTE_HANDLER) {   
      throw std::exception("structured exception");
   }
}

【讨论】:

  • 可以创建一个包装函数,但是抛出、捕获然后再次抛出感觉有点奇怪,这样我就可以得到一个 EXCEPTION_POINTERS 结构来喂进入CStructured_Exception。不过,我猜这是一个有效的替代方案... +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多