我应该使用多个嵌套测试__builtin_expected
中的gcc if
宏包裹什么?我有这段代码:
if((x<RADIUS && (forward?v<0:v>0)) || (x+RADIUS>dimensions[d] && (forward?v>0:v<0)))
我(荒谬地)包裹了我能做的一切:
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
if(unlikely(unlikely(unlikely(x<RADIUS) && likely(likely(forward)?likely(v<0):likely(v>0))) || unlikely(unlikely(x+RADIUS>dimensions[d]) && likely(likely(forward)?likely(v>0):likely(v<0)))))
我希望这只是一种矫枉过正,因为它几乎不可读。
答案 0 :(得分:4)
我认为这里没有错误的答案。编译器将使用您的提示来决定在每次比较中使用“else”情况的情况;这不仅仅是C代码,而是在逻辑的 ands 和 ors 中,而且信息越多越好。
为了便于阅读代码,我建议将其保留为大的东西:每个if语句一次,但这并不是基于任何确凿的证据。
您是否考虑过使用-fprofile-generate
,使用典型数据运行代码,然后使用-fprofile-use
进行重建?这样编译器就可以为所有这些情况构建自己的图片。这更具可移植性(没有特定于编译器的注释),更具可读性,更适合未来。