3

据我了解,C++ 属性[[noreturn]]可以应用于不返回调用者的函数,以便编译器可以生成更优化的代码。我确实理解它对“正常”功能有影响,但想知道在将其应用于main功能时它是否也会对性能产生影响。

假设我想编写一个不断运行的程序而不会中止(这意味着该main函数永远不会返回给调用者(=操作系统)

其中哪一个生成更快(更优化)的代码,或者根本没有任何区别?

选项1:

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

选项 2:

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

2 回答 2

3

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

但是,在您的 .js 中可以获得一点好处main(),因为从理论上讲,该noreturn版本将生成稍小的代码,因为编译器可以省略称为结尾的指令序列。

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

于 2017-04-13T09:19:52.980 回答
1

noreturn 属性应该用于不返回给调用者的函数。这并不意味着 void 函数(确实返回给调用者 - 它们只是不返​​回值),而是在函数完成后控制流不会返回到调用函数的函数(例如退出应用程序的函数,永远循环或抛出异常)。

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

from noreturn 的意义何在?

编辑:

清楚地回答帖子。我认为在 main 中使用 no return 有一点好处,但这是一种不好的做法。在 C/C++ 中通过“约定”,如果一切正常,你必须return 0;在你的主要

于 2017-04-13T09:16:09.903 回答