Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提示C编译器(GCC或Clang)可能的变量值/范围_C_Gcc_Clang_Llvm - Fatal编程技术网

提示C编译器(GCC或Clang)可能的变量值/范围

提示C编译器(GCC或Clang)可能的变量值/范围,c,gcc,clang,llvm,C,Gcc,Clang,Llvm,在下面的代码中,将只进行一次比较,因为编译器知道条件是独占的,我们将始终输入第二个条件,即bar将是必需的>32: int foo(int bar) { if (bar <= 64) return 1; if (bar > 32) { printf("Too many elements"); } return 0; } 是否是我编写例如LLVM通行证的唯一解决方案?您可以在GCC中使用\uuu内置\uu不可访问: if

在下面的代码中,将只进行一次比较,因为编译器知道条件是独占的,我们将始终输入第二个条件,即
bar
将是必需的>32:

int foo(int bar) {
    if (bar <= 64)
        return 1;
    if (bar > 32) {
        printf("Too many elements");
    }
    return 0;
}

是否是我编写例如LLVM通行证的唯一解决方案?

您可以在GCC中使用
\uuu内置\uu不可访问

if (bar > 32) {
  __builtin_unreachable();
}
\u内置\u假定
在叮当声中:

__builtin_assume(bar <= 32);

为何IMO X-Y问题。我认为这里不需要细节,这是为了高速网络优化。根据预测输入专门化代码。我稍微修改了问题,使其更清晰,并说明了输入。我认为您可以使用GCC的
\u builtin\u expect
:谢谢@ForceBru,但这只是一个提示,将保留分支。它只会确保最可能的代码不在跳转路径上。我想删除跳转部分。我想,也许是因为:请注意,写通行证非常非常简单。是的,它很有效!我用gcc-S进行了验证,没有任何比较了。也许我遗漏了一些明显的东西,但您的两个示例似乎是相反的:gcc示例声明
bar@ruakh-Yikes!修正了。在叮当声中,你应该使用
\uuuuuuu builtin\u ascape
,即使
\uuuuuu builtin\u unreachable
可用-后者不会导致优化程序忽略代码,但前者会。
__builtin_assume(bar <= 32);
__assume(bar <= 32);