使用 __builtin_expect 的指南

2024-01-12

我应该用 gcc 包装什么__builtin_expected内的宏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)))))

我希望这只是一种矫枉过正,因为它几乎不可读。


我认为这里没有错误的答案。编译器将使用您的提示来决定每次比较的“else”情况为哪种情况;这不仅仅是其他的 C 代码,而且是在ands and ors逻辑也很重要,信息越多越好。

为了代码可读,我建议将其保留为大内容:每个 if 语句一次,但这并不是真正基于任何确凿的证据。

您是否考虑过使用-fprofile-generate,使用典型数据运行代码,然后使用-fprofile-use?这样编译器就可以为所有这些情况构建自己的图片。这更可移植(没有特定于编译器的注释)、更具可读性并且更适合未来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 __builtin_expect 的指南 的相关文章

随机推荐