相关疑难解决方法(0)

noreturn有什么意义?

[dcl.attr.noreturn]提供以下示例:

[[ noreturn ]] void f() {
    throw "error";
    // OK
}
Run Code Online (Sandbox Code Playgroud)

但我不明白有什么意义[[noreturn]],因为函数的返回类型已经存在void.

那么,该noreturn属性的重点是什么?它应该如何使用?

c++ attributes c++11 noreturn

178
推荐指数
5
解决办法
3万
查看次数

我如何制作一个不会被优化掉的无限空循环?

C11 标准似乎暗示不应优化带有常量控制表达式的迭代语句。我从这个答案中得到了我的建议,它特别引用了标准草案中的第 6.8.5 节:

其控制表达式不是常量表达式的迭代语句......可能会被实现假定为终止。

在该答案中,它提到while(1) ;不应进行优化之类的循环。

那么……为什么 Clang/LLVM 优化了下面的循环(用 编译cc -O2 -std=c11 test.c -o test)?

#include <stdio.h>

static void die() {
    while(1)
        ;
}

int main() {
    printf("begin\n");
    die();
    printf("unreachable\n");
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这会打印出begin,然后在非法指令(ud2放置在 之后的陷阱die())上崩溃。在 Godbolt 上,我们可以看到调用puts.

让 Clang 输出无限循环是一项非常困难的任务-O2- 虽然我可以反复测试一个volatile变量,但这涉及到我不想要的内存读取。如果我做这样的事情:

#include <stdio.h>

static void die() {
    while(1)
        ;
}

int main() {
    printf("begin\n");
    volatile int x …
Run Code Online (Sandbox Code Playgroud)

c clang compiler-optimization language-lawyer

141
推荐指数
6
解决办法
3万
查看次数