【发布时间】:2019-11-08 22:51:20
【问题描述】:
C++ 中的 noexcept 如何改变程序集?我在godbolt中尝试了一些小功能,但是the assembly did not change。
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不会“更改程序集”,但它提供了库代码可以依赖的语义含义,这最终可能导致程序集发生重大变化,或者程序集没有变化。 -
noexcept函数的主体也可以以更优化的方式进行编译,因为在异常情况下不需要正确销毁局部变量。见这里:stackoverflow.com/questions/26079903/… -
你的例子太简单了,编译器已经知道它是noexcept,而不是你告诉它。使用更复杂的示例,例如调用另一个代码文件中的另一个函数,因此编译器看不到它肯定是 noexcept。
-
当然
noexcept语句也可能导致调用 函数的汇编代码不同(特别是如果该函数包含try-catch语句) . -
noexcept真的只有在 A) 有析构函数要运行,所以有重要的项目要析构 B) 异常 可以 被抛出,因此编译器必须处理这些案件。
标签: c++ assembly compiler-optimization noexcept