❝来自于linux内核中的一段代码挺有意思的,分享给大家。❞
下列代码的目的是「将"分支转移"的信息提供给编译器,这样可以让编译器对其代码进行优化,以减少指令跳转带来的性能下降」。
__builtin_expect
的意思是「允许程序员将最有可能执行的分支告诉给编译器」。
#define likely(x) __builtin_expect(!!(x), 1) /* x很可能为真 */
#define unlikely(x) __builtin_expect(!!(x), 0) /* x很可能为假 */
例如:
if (likely(var)) /* if (var) */
if (unlikely(var)) /* if (!var) */
「我们看到它使用了双重否定(逻辑非),它的作用是让表达式转换为布尔型」。 例如:
int x = 1;
bool b = !!x;
还可以这样:(关于not关键词请查看往期文章:「C++替代关键词(and,or,not)」)
int x = 1;
bool b = not not x;
但实际代码中Qt君认为这样写更明确:
bool b = (x != 0);