C++中的noexcept如何改变汇编代码?我在godbolt上尝试了一些小函数,但是发现汇编代码没有改变。
float pi()
//noexcept // no difference
{ return 3.14; }
int main(){
float b{0};
b = pi();
return 0;
}
我正在寻找一个最小的工作示例,以便我可以看到由于noexcept
而导致汇编中的变化。
std::vector<MyType>
中,如果MyType
的移动构造函数不是noexcept
,std::vector
在重新调整大小时必须复制元素,而不是仅仅移动它们。在其他情况下,就像你所看到的那样,这可能没有任何区别。简而言之,noexcept
不会“改变程序集”,但它提供了库代码可以依赖的语义含义,这最终可能导致程序集中的重大变化,或者根本不会有程序集的变化。 - Justinnoexcept
声明的函数体还可以以更高效的方式编译,因为在异常发生时不需要正确地销毁局部变量。请参见此处:https://dev59.com/PV8e5IYBdhLWcg3wHXaJ - alter_igelnoexcept
语句也可能会导致调用函数的不同汇编代码(特别是如果该函数包含try-catch
语句)。 - Martin Rosenaunoexcept
只有在以下情况下才会产生影响:A)存在需要析构的非平凡项,B)可能抛出异常,因此编译器必须处理这些情况。 - Mgetz