将 [[noreturn]] 添加到 main 函数是否有意义

Does adding [[noreturn]] to main function make sense

据我了解,C++ 属性 [[noreturn]] 可以应用于未 return 调用方的函数,以便编译器可以生成更优化的代码。我知道它对 "normal" 函数有影响,但我想知道在将它应用于 main 函数时它是否也会对性能产生影响。

假设我想不断地编写一个程序 运行 它不可能中止(这意味着 main 函数永远不会 return 给调用者(=操作系统)

其中哪一个生成的代码更快(更优化)或者根本没有什么不同?

选项 1:

int main()
{
    while(true)
    //..
    return 0;
}

选项 2:

[[noreturn]] int main()
{
    while(true)
    //..
    return 0;
}

noreturn 属性应该用于不 return 给调用者的函数。这并不意味着无效函数(对调用者执行 return - 它们只是不 return 一个值),而是控制流不会 return 到调用函数的函数函数完成后(例如退出应用程序的函数、永远循环或抛出异常)。

编译器可以使用它来进行一些优化并生成更好的警告。例如,如果 f 具有 noreturn 属性,编译器会在您编写 f() 时警告您 g() 是死代码; G();。同样,编译器将知道在调用 f().

后不会警告您缺少 return 语句

来自 What is the point of noreturn?

编辑:

明确回答post。我认为在 main 中不使用 return 有一点好处,但这是一种不好的做法。在 C/C++ by "convention" 如果一切正常,你必须 return 0; 在你的 main

noreturn 主要用于函数的调用者,而不是函数本身,在 main() 的情况下,main() 的调用者是 C++ 运行时,它是现成的,所以编译器不会编译它,所以那里没有什么可以优化的。

但是,在您的 main() 中可以获得一个微小的好处,因为从理论上讲,noreturn 版本会生成稍微小一点的代码,因为编译器可以省略称为结语。

这些性能 (speed/size) 提升是微不足道的,不值得过多关注。更有趣的是,如果您在调用 noreturn 函数后立即编写了任何代码,则可能会收到警告。在这种情况下,编译器应该能够警告您,您的这段代码将永远不会被执行。我发现这更有用。