【发布时间】:2014-02-23 03:31:55
【问题描述】:
据我所知,SO 社区在声明函数noexcept 是否能够实现有意义的编译器优化方面存在分歧,而这在其他情况下是不可能的。 (我说的是编译器 优化,而不是基于move_if_noexcept 的库实现优化。)出于这个问题的目的,我们假设noexcept 确实使有意义的代码生成优化成为可能。有了这个假设,声明inline 函数noexcept 有意义吗?假设这些函数实际上是内联的,这似乎需要编译器在调用站点的 inline 函数产生的代码周围生成等效的 try 块,因为如果该区域出现异常,terminate必须调用。如果没有noexcept,try 块似乎是不必要的。
我最初的兴趣是声明 Lambda 函数 noexcept 是否有意义,因为它们隐含为 inline,但后来我意识到任何 inline 函数都会出现同样的问题,而不仅仅是 Lambda。
【问题讨论】:
-
A
try-block 意味着堆栈展开。调用terminate不会。 -
抛开效率问题不谈,如果函数真的应该是 noexcept,这可能会在情境中有用。
-
@dyp:当我写“相当于
try块”时,我试图表达这样一种想法,即仍然必须生成代码以在运行时检测异常并调用@987654337 @如果他们出现了。我同意生成的代码不需要完全像真正的try块那样做。 -
@KnowItAllWannabe 即使内联函数不是
noexcept,也可能需要生成等效的try 块。但是,由于 try 块的运行时成本为 0,因此这应该不是问题。 -
@KnowItAllWannabe 首先,您仍然必须在任何局部变量上调用析构函数。第二个:try 块的成本为零,因为如果你有 try 块,或者没有,编译器会生成完全相同的代码。 (至少,任何体面的编译器都会这样做。标准并没有禁止生成额外的代码,但没有理由这样做。)