据我了解,该属性告诉编译器函数不会返回。当函数返回 void 时指定 this 有什么好处?
这两个功能有何不同?
void foo(){}
__attribute__((noreturn)) void foo(){}
Run Code Online (Sandbox Code Playgroud)
这并不意味着该函数不返回值——而是意味着该函数根本不返回。调用该函数会产生单程旅行。
在与硬件相关的编程中,此功能的使用有限,您不希望在调用方堆栈上生成任何函数调用开销,因为无论如何您都不会返回那里。
例如,当void main (void)从微控制器嵌入式系统内的 CRT 启动代码调用时,这些系统会一直运行,直到您插入电源,并且它们永远不会从main(). 因此,如果此类系统的编译器支持_Noreturn void main (void),那么就会减少浪费的堆栈空间。否则,CRT 只会将 x 个字节压入堆栈,该堆栈将永远保留在那里,作为死空间。
它对于诊断目的也可能有用,例如在检查编译器的行为时。正如此处所做的那样,在演示 clang 编译器中的一些主要错误时。
返回类型和函数的“无返回”行为之间没有关系。
返回void类型只是告诉这个函数没有返回值(如果它返回的话)。
有些函数永远不会返回给调用者。例如一些消息处理无限循环、exit()替换当前进程的函数(如exec*family)。暗示__attribute__((noreturn))编译器可能会考虑对此特定函数进行某些优化,这些优化对于不返回的函数有效- 例如优化调用此类函数的开销(如保存调用者的上下文、返回地址等)。