据我所知,C ++属性[[noreturn]]
可以应用于不返回调用者的函数,以便编译器可以生成更优化的代码。我确实理解它对“普通”函数有所不同,但是想知道它在将它应用于main
函数时是否也会对性能产生影响。
假设我想编写一个持续运行的程序而不会中止(意味着main
函数永远不会返回给调用者(=操作系统)
其中哪一项在更快(更优化)的代码中生成,或者根本没有产生任何影响?
选项1:
int main()
{
while(true)
//..
return 0;
}
选项2:
[[noreturn]] int main()
{
while(true)
//..
return 0;
}
答案 0 :(得分:3)
noreturn
主要用于函数的调用者,而不是函数本身,在main()
的情况下,main()
的调用者是C ++运行时,它是准备好的 - make,所以编译器无法编译它,所以没有什么可以优化的。
但是,在main()
中可以获得很小的好处,因为从理论上讲,noreturn
版本会产生略小的代码,因为编译器可以省略称为结尾的指令序列。
这些性能(速度/尺寸)增益微不足道,并不值得关注。更有趣的是,如果您在调用noreturn
函数后立即编写了任何代码,则可能会收到警告。在这种情况下,编译器应该能够警告您,您的此代码将永远不会被执行。我发现这更有用。
答案 1 :(得分:1)
noreturn属性应该用于不会返回给调用者的函数。这并不意味着void函数(它们确实返回调用者 - 它们只是不返回值),但是在函数完成后控制流不会返回到调用函数的函数(例如,函数退出应用程序,永远循环或抛出异常)。
编译器可以使用它来进行一些优化并生成更好的警告。例如,如果f具有noreturn属性,编译器可能会在写入f()时警告您g()是否为死代码; G();。类似地,在调用f()之后,编译器将不会警告您缺少返回语句。
来自What is the point of noreturn?
编辑:
明确地向帖子说道。我觉得在主要时候没有回报会带来微小的好处,但这是一种不好的做法。在C / C ++中"惯例"如果一切顺利,你必须return 0;
在主