我了解,C++属性[[noreturn]]
可以应用于不返回给调用方的函数,以便编译器可以生成更优化的代码。我确实知道它对"正常"功能有所不同,但想知道将其应用于main
函数时它是否也会对性能产生影响。
假设我想编写一个持续运行的程序,它不会中止(这意味着main
函数永远不会返回调用方(= 操作系统(
其中哪一个会生成更快(更优化(的代码,或者根本没有区别?
选项 1:
int main()
{
while(true)
//..
return 0;
}
选项 2:
[[noreturn]] int main()
{
while(true)
//..
return 0;
}
noreturn
主要对函数的调用者有用,而不是函数本身,在main()
的情况下,main()
的调用者是现成的C++运行时,因此编译器无法编译它,因此那里没有什么可以优化的。
但是,在您的main()
中获得一个小好处,因为从理论上讲,noreturn
版本将产生略小的代码,因为编译器可以省略称为尾声的指令序列。
这些性能(速度/大小(增益是微不足道的,并不值得关注。 更有趣的是,如果您在调用 noreturn
函数后立即编写了任何代码,则可能会收到警告。在这种情况下,编译器应该能够警告您,您的此代码将永远不会执行。 我发现这更有用。
noreturn 属性应该用于不返回给调用方的函数。这并不意味着 void 函数(它们确实返回给调用方 - 它们只是不返回值(,而是控制流在函数完成后不会返回到调用函数的函数(例如退出应用程序的函数、永远循环或抛出异常(。
编译器可以使用它来进行一些优化并生成更好的警告。例如,如果 f 具有 noreturn 属性,编译器可以在您编写 f(( 时警告您 g(( 是死代码;g();.类似地,编译器将知道在调用 f(( 后不要警告您缺少返回语句。
从 什么是不归路?
编辑:
要清楚地到岗位上。我认为在主要情况下使用不回报有一个很小的好处,但这是一种不好的做法。在 C/C++ 中,如果一切正常,您必须在主要return 0;