提示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);