builtin-expect

Author Avatar
Aryb1n 6月 28, 2018

开始yy错了, 在glibc里

void * __libc_malloc (size_t bytes)
{
    mstate ar_ptr;
    void *victim;

    void *(*hook) (size_t, const void *) = atomic_forced_read (__malloc_hook);

    if (__builtin_expect (hook != NULL, 0))
        return (*hook)(bytes, RETURN_ADDRESS (0));

    ....
}

我开始以为这个if里的东西是和builtin_expect的第二个参数有关系

但查找后发现是

__builtin_expect(long EXP, long C)是返回EXP的,不是返回EXPC比较结果

这个函数是说EXP == C的可能性比EXP != C的可能性大, 然后编译器可以通过这个对代码进行优化之类的操作

只是我们预测EXP就是C

就比如上面代码中

if(__builtin_expect(hook != NULL, 0))

等效为…就只是看__builtin_expect第一个参数

if(hook != NULL)

而只是更可能有

(hook != NULL) == 0
// 就是hook通常是NULL, 编译器就可以通过这一点来优化代码

还有就是hexo这里,如果标题里有俩斜杠,就看造成代码高亮有问题…