当前位置: 首页 > 面试题库 >

在else语句中,GCC的__builtin_expect有什么优势?

赵志
2023-03-14
问题内容

我碰到了一个#define他们用的__builtin_expect

该文件说:

内置功能: long __builtin_expect (long exp, long c)

您可以__builtin_expect用来向编译器提供分支预测信息。通常,您应该更喜欢为此(-fprofile- arcs)使用实际的配置文件反馈,因为众所周知,程序员在预测其程序的实际执行效果方面很差。但是,在有些应用程序中很难收集此数据。

返回值是的值exp,应为整数表达式。内置的语义是预期的 exp == c。例如:

      if (__builtin_expect (x, 0))
        foo ();

表示我们不希望调用foo,因为我们希望x为零。

那么为什么不直接使用:

if (x)
    foo ();

而不是复杂的语法__builtin_expect


问题答案:

想象一下将由以下代码生成的汇编代码:

if (__builtin_expect(x, 0)) {
    foo();
    ...
} else {
    bar();
    ...
}

我想应该是这样的:

  cmp   $x, 0
  jne   _foo
_bar:
  call  bar
  ...
  jmp   after_if
_foo:
  call  foo
  ...
after_if:

您可以看到,指令的排列顺序是bar大小写先于foo大小写(与C代码相对)。这可以更好地利用CPU管线,因为跳转会破坏已经获取的指令

在执行跳转之前,将其下面的指令(bar案例)推送到管道中。由于foo情况不太可能发生,因此也不太可能发生跳跃,因此不太可能对管道造成破坏。



 类似资料:
  • 我制作了这个简单的GUI程序,它可以计算特定字符序列的元音和辅音。计数器还可以,但是我对if-else语句有一个问题,当那个字符既不是元音也不是辅音时,我必须显示一条消息...代码如下: 它看起来是这样的: 我输入了一个没有任何特殊字符或数字的字符“序列”。但它仍然显示消息,其中它有元音和辅音以外的其他字符。if-else语句有问题吗?感谢您的帮助:)

  • 首先,我发现了另外两条有类似问题的线索。问题在于,他们没有为字符串使用正确的等号,也没有为他们的特定问题正确设置if语句的格式。 在我的任务中,我需要创建一个名为“猪”的游戏,玩家与计算机对决,在掷骰子时先获得100分。如果玩家在一个回合中掷1,他们不会得到额外的分数。如果玩家掷两个1,那么他们将失去所有分数。我还没有对电脑的回合进行编码,只是专注于玩家。请告诉我我做错了什么。提前非常感谢。 我的

  • Swift 条件语句 一个 if 语句 后可跟一个可选的 else if...else 语句,else if...else 语句 在测试多个条件语句时是非常有用的。 当你使用 if , else if , else 语句时需要注意以下几点: if 语句后可以有 0 个或 1 个 else,但是如果 有 else if 语句,else 语句需要在 else if 语句之后。 if 语句后可以有 0

  • else语句可以与if语句结合使用。 else语句包含else语句中的条件表达式解析为0或FALSE值时执行的代码块。 else语句是一个可选语句, else后面最多只能有一个else语句。 语法 (Syntax) if...else语句的语法是 - if expression: statement(s) else: statement(s) 流程图 (Flow Diagram) 例

  • 着色器语言GLSL中关于if语句、for语句的使用,和javascript语言、C语言中的if语句、for语句执行逻辑规则基本一致,这里默认你已经有一定的编程基础,也就不做过多讲解,只是简单说明一下。 单独使用if if(x>100){ gl_FragColor = vec4(1.0,0.0,0.0,1.0);//红色 } if-else形式 bool colorBool; // 根据布尔值

  • 问题内容: 当需要指定特定状态时,我需要更改渲染功能并运行一些子渲染功能, 例如: 如何在不更改场景的情况下实现这一点,我将使用标签动态更改内容。 问题答案: 根据 DOC : if-else语句在JSX中不起作用。这是因为JSX只是函数调用和对象构造的语法糖。 基本规则: JSX从根本上讲是syntactic sugar.。编译后,JSX表达式成为常规的JavaScript函数调用,并评估为Ja