【问题标题】:Would C++ exception stops function from being inlined?C++ 异常会阻止函数被内联吗?
【发布时间】:2011-09-21 03:53:25
【问题描述】:

假设我有一个非常简单的函数,我希望编译器内联它。但是我可能需要在看到一些无效输入时抛出异常,这会阻止编译器内联函数吗?

【问题讨论】:

  • 简短回答:不。内联独立于异常处理,因为它只是调用者中函数的复制/粘贴。
  • 如果我在关闭异常处理的情况下编译,我会摆脱一堆警告,看起来像这样:... Inlining of specified subprogram failed due to the presence of a C++ exception handler: utills::ScopeFile<utills::MpiAbbortOnError>::~ScopeFile()。请注意,它抱怨的事情甚至不是异常,但似乎必须以相同的方式处理析构函数。这些警告出现在链接阶段,当我执行xlC object1.o object2.o -o my_binary(xlC 是 IBM 编译器)时。
  • 我认为这是某种特定的 IBM 编译器问题,但在与一个更开明的人进行的简短(不幸的是)对话中,我确信这是一个普遍问题。不幸的是,由于我没有那么开明,我无法提出论点,但我相信“消除堆栈”的关键词,如果你有某种对象,比如异常,这是不可能的。我会非常非常有兴趣阅读对此的详细解释。当我禁用异常处理时,我的应用程序速度会翻倍(这并不夸张)。
  • 我不得不提到,该应用程序非常小众:它执行特定物理过程(扩散)的模拟,并且它在不大于 100 行的小循环中花费 90% 的时间代码。所以另一个简短的回答:是的,它可能会阻止内联。我手头确实有证据。甚至更多可能是一个基本的问题,与特定的编译器无关。
  • @Mysticial 很高兴听到您对此的看法。

标签: c++ exception inline


【解决方案1】:

编译器可以出于任何原因拒绝内联。 gcc 列出了它可能not inline a function 的原因,但抛出异常不在其中。此外,如果编译器无法内联您标记为内联的函数,选项 -Winline 将导致编译器发出警告。您可以尝试一下,看看您是否正在采取任何措施来防止内联。

【讨论】:

    【解决方案2】:

    编译器内联抛出的函数是完全合理和有效的。

    【讨论】:

      【解决方案3】:

      我刚刚在 MSVC 版本 19 中遇到了这种情况。在为 x86 编译时,抛出异常的函数不会被内联。如果我用exit(1) 替换throw,或者如果我为x86-64 编译,它会被内联就好了。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 2011-02-09
      相关资源
      最近更新 更多