我遇到了几种情况,想要表达一个函数的返回值可能在函数体内,而不是调用它的if语句中。
例如,假设我想从使用 LIKELY
宏移植代码到使用新的 [[likely]]
注释。但是它们在语法上放置的位置不同:
#define LIKELY(...) __builtin_expect(!!(__VA_ARGS__),0)
if(LIKELY(x)) { ... }
对比
if(x) [[likely]] { ... }
重新定义LIKELY
宏以使用注释并没有简单的方法。是否可以定义一个函数,如下:
inline bool likely(bool x) {
if(x) [[likely]] return true;
else return false;
}
将提示传播到 if 中?例如:
if(likely(x)) { ... }
同样地,在通用代码中,即使已知其他位置的算法可能性信息,也很难在实际的if
语句中直接表达。例如,当谓词几乎总是为假时的copy_if
。据我所知,没有办法使用属性来表达这一点,但如果分支权重信息可以通过函数进行传播,则问题得到解决。
到目前为止,我还没有找到相关的文档,并且我不知道如何设置好环境,以便查看输出汇编代码并对此进行测试。
__builtin
的语义是为变量提供预期值,而不是特定于在分支中使用它。(正如Nate所示,GCC确实这样做,但clang trunk似乎没有。) - Peter Cordes#define LIKELY(x) (__builtin_expect(!!(x),0))
并使用if LIKELY(x) { ... }
。这样,移植就会变得容易。 (或者甚至可以定义一个if_likely(x)
宏,将if
关键字移动到宏定义中。) - Ilmari Karonen