【发布时间】: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 很高兴听到您对此的看法。