将 [[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
函数后立即编写了任何代码,则可能会收到警告。在这种情况下,编译器应该能够警告您,您的这段代码将永远不会被执行。我发现这更有用。
据我了解,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
函数后立即编写了任何代码,则可能会收到警告。在这种情况下,编译器应该能够警告您,您的这段代码将永远不会被执行。我发现这更有用。