Kno*_*abe 18 c++ inline noexcept c++11
据我所知,SO社区对于声明一个函数是否noexcept
能够实现有意义的编译器优化存在分歧.(我正在谈论编译器优化,而不是基于的库实现优化move_if_noexcept
.)出于这个问题的目的,我们假设noexcept
确实可以进行有意义的代码生成优化.有了这个假设,声明inline
函数noexcept
是否有意义?假设这些函数实际上是内联的,这似乎要求编译器生成等效于调用站点函数try
产生的代码块inline
,因为如果在该区域出现异常,则terminate
必须调用.没有noexcept
,那个try
街区似乎没必要.
我最初的兴趣在于声明Lambda函数是否有意义noexcept
,因为它们是隐含的inline
,但后来我意识到任何inline
函数都会出现相同的问题,而不仅仅是Lambdas.
Ste*_*sop 11
让我们假设noexcept确实可以进行有意义的代码生成优化
好
假设这些函数实际内联,这似乎要求编译器在调用站点的内联函数生成代码周围的try块,因为如果在该区域出现异常
不一定,因为它可能是编译器可以查看函数体并看到它不可能抛出任何东西.因此,可以省略名义异常处理.
如果函数是"完全"内联的(也就是说,如果内联代码不包含函数调用)那么我希望编译器可以相当普遍地做出这个决定 - 但是例如在没有调用的情况下vector::push_back()
和函数的编写者知道已经保留了足够的空间但编译器没有.
还要注意,在一个好的实现中,try块实际上可能根本不需要在没有抛出任何内容的情况下执行任何代码.
有了这个假设,声明内联函数noexcept是否有意义?
是的,为了得到假设的优化noexcept
.
归档时间: |
|
查看次数: |
1477 次 |
最近记录: |