相关疑难解决方法(0)

Linux内核中可能/不太可能的宏如何工作以及它们的好处是什么?

我一直在挖掘Linux内核的某些部分,发现这样的调用:

if (unlikely(fd < 0))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

要么

if (likely(!err))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

我找到了它们的定义:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
Run Code Online (Sandbox Code Playgroud)

我知道它们是为了优化,但它们是如何工作的?使用它们可以预期性能/尺寸减少多少?至少在瓶颈代码中(当然在用户空间中)是否值得麻烦(并且可能失去可移植性).

linux gcc linux-kernel likely-unlikely

331
推荐指数
6
解决办法
13万
查看次数

GCC的__builtin_expect走了多远?

在回答另一个问题时,我对此感到好奇.我很清楚

if( __builtin_expect( !!a, 0 ) ) {
    // not likely
} else {
    // quite likely
}
Run Code Online (Sandbox Code Playgroud)

通过做一些暗示处理器/更改汇编代码顺序/某种魔术的东西,将使"非常可能"的分支更快(通常).(如果有人能澄清那个也很棒的魔法).

但这是否适用于a)内联ifs,b)变量和c)除0和1以外的值?即会

__builtin_expect( !!a, 0 ) ? /* unlikely */ : /* likely */;
Run Code Online (Sandbox Code Playgroud)

要么

int x = __builtin_expect( t / 10, 7 );
if( x == 7 ) {
    // likely
} else {
    // unlikely
}
Run Code Online (Sandbox Code Playgroud)

要么

if( __builtin_expect( a, 3 ) ) {
    // likely
    // uh-oh, what happens if a is 2?
} else {
    // unlikely
} …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization gcc

21
推荐指数
2
解决办法
7999
查看次数

可能(真实)属性的重点是什么

我只是在cppreference上阅读C++中的属性.他们在那里提到了可能的(真实)属性,现在我想知道它有什么好处.不幸的是,我无法在网上找到更多信息.

这是处理器在执行期间使用的某种分支预测吗?

c++ attributes

1
推荐指数
1
解决办法
187
查看次数

标签 统计

c++ ×2

gcc ×2

attributes ×1

c ×1

likely-unlikely ×1

linux ×1

linux-kernel ×1

optimization ×1