考虑以下 C 程序:
\ndouble local_array[10];\n/* local computations */\nf(); // f() cannot modify the local_array since the local_array has not escaped\nlocal_array[i] += 5.0;\nRun Code Online (Sandbox Code Playgroud)\n如果f()已知正常返回,则可以local_array[i] += 5.0;在调用之前移动,也许是为了效率(可以将加载 - 浮动添加 - 存储序列与前面的计算混合在一起)。
然而,如果f()不知道正常返回,则这对于标准而言可能是非法的。事实上,如果f()打印一条错误消息并退出,那么在它之前进行访问local_array[i]可能会失败(由于 的值不正确而导致错误的指针i),这将是危险的。我们无法知道是否p指向有效的、可写的内存。也许f()执行排除无效值的检查p。
所以我的问题是:有没有办法告诉编译器(也许是 gcc 或 clang)函数总是正常返回?
\n有一个nothrow属性,但似乎略有不同。
这样的属性将是 的“对偶” noreturn,这意味着函数永远不会返回。
如果你想知道这是怎么回事:PostgresSQL bug #616180是关于旧版本的gcc假设,他们可以在终止程序执行的函数调用之前对捕获指令进行类似的移动(由于检测到内部错误)。我认为gcc所做的事情是不正确的\xe2\x80\xa6 但是那么如何才能告诉它允许它执行这样的优化呢?
对于 GCC:不,这样的属性不存在,甚至在编译器内部也不存在(从 GCC 13 开始)。
对于 Clang/LLVM:LLVM IR 具有willreturnfunction 属性,但 Clang 没有为 C 和 C++ 公开它。