可能(x) 和 __builtin_expect((x),1)

2023-11-26

我知道内核使用likely and unlikely宏惊人。宏的文档位于内置函数:long __builtin_expect(long exp, long c)。但他们并没有真正讨论细节。

编译器到底是如何处理的likely(x) and __builtin_expect((x),1)?

它是由代码生成器还是优化器处理的?

它取决于优化级别吗?

生成的代码的示例是什么?


我刚刚在 gcc 上测试了一个简单的例子。

对于 x86,这似乎由优化器处理并取决于优化级别。尽管我猜这里的正确答案是“这取决于编译器”。

生成的代码取决于 CPU。一些CPU(我立即想到sparc64,但我确信还有其他CPU)在条件分支指令上有标志,告诉CPU如何预测它,因此编译器根据构建生成“预测真/预测假”指令在编译器的规则和代码的提示中(例如__builtin_expect).

英特尔在这里记录了他们的行为:https://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts。简而言之,Intel CPU 上的行为是,如果 CPU 之前没有有关分支的信息,它将预测不太可能采用前向分支,而可能采用后向分支(考虑循环与错误处理)。

这是一些示例代码:

int bar(int);
int
foo(int x)
{
    if (__builtin_expect(x>10, PREDICTION))
        return bar(10);
    return 42;
}

编译(我使用 omit-frame-pointer 使输出更具可读性,但我仍然在下面清理它):

$ cc -S -fomit-frame-pointer -O0 -DPREDICTION=0 -o 00.s foo.c
$ cc -S -fomit-frame-pointer -O0 -DPREDICTION=1 -o 01.s foo.c
$ cc -S -fomit-frame-pointer -O2 -DPREDICTION=0 -o 20.s foo.c
$ cc -S -fomit-frame-pointer -O2 -DPREDICTION=1 -o 21.s foo.c

00.s 和 01.s 之间没有区别,因此这表明这取决于优化(至少对于 gcc 而言)。

这是(清理后的)生成的 20.s 代码:

foo:
    cmpl    $10, %edi
    jg  .L2
    movl    $42, %eax
    ret
.L2:
    movl    $10, %edi
    jmp bar

这是 21.s:

foo:
    cmpl    $10, %edi
    jle .L6
    movl    $10, %edi
    jmp bar
.L6:
    movl    $42, %eax
    ret

正如预期的那样,编译器重新排列了代码,以便我们不希望采用的分支在前向分支中完成。

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

可能(x) 和 __builtin_expect((x),1) 的相关文章

  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • Rust 中声明变量的宏?

    在 C 中 可以编写声明变量的宏 如下所示 define VARS a b c int a b c 当然 这不是您通常想要做的事情 在实际的例子中 我希望开始工作 但它并不那么简单 define VARS data stride a b c
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 在 ASP.Net Core 中发布表单数据时出现 400 状态错误 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在开发一个 ASP Net Core 2 0 应用程序并在 Linux Nginx Kestrel 上运行它 在开发环境 Windows 10 上一切运行顺利 此外 在项目目录中使用
  • 托管和设置自己的闪亮应用程序,无需闪亮服务器

    我正在尝试为我的同事提供闪亮的应用程序 而他们无需运行甚至无需安装 R 所以我读了这个网页并找到了这句话 如果您熟悉网络托管或有权访问 IT 部门 您可以自己托管您的 Shiny 应用程序 在下面 分享为网页 部分 我怎样才能做到这一点 问
  • Try It 演示中的 Google Drive SDK 更新(删除/插入)所有者权限 500 错误

    我正在开发一个应用程序 它应该为 Google Apps 管理员提供重新分配文件所有权的能力 目前我正在使用 Google Drive SDK for NET 和 C 代码 当我在 Google Drive SDK 测试演示中进行身份验证时
  • 如何在 Twig 中使用 sprintf 格式化数字?

    我需要格式化一个数字 在 PHP 中 我会使用sprintf 05d lineNumber 在 Symfony 2 Twig 模板中 我应该使用什么代码 If i之前是 4 然后将其添加到 Twig 模板后 02d format i 它将成
  • 找出 ASP.NET 身份验证票证过期的原因

    我需要帮助弄清楚为什么我的身份验证票证在我的托管网站上大约一个小时后就过期了 但是 如果我在本地运行该站点 身份验证票证将在正确的时间内保持活动状态 这是我的本地主机 web config
  • Steam 市场货币和 XML 格式

    我试图在市场上以某种货币获取商品页面 尝试添加 Accept Language ru RU r n and Accept Language ru RU ru r n and Accept Language ru ru RU q 0 8 r
  • git 清理旧分支

    我想创建一个 git 命令来删除当前分支中包含所有提交的任何分支 例如 git branch groups master git cleanup branches deleted groups all commits are include
  • 删除向量开头和结尾的零

    我有一个像这样的向量 x lt c 0 0 0 0 4 5 0 0 3 2 7 0 0 0 我只想保留位置 5 到 11 的元素 我想删除开头和结尾的零 对于这个向量来说 这很容易 因为它很小 我有非常大的数据 需要所有向量的通用信息 尝试
  • PostgreSQL 忽略时间戳列上的索引

    我创建了下表和索引 CREATE TABLE cdc auth user cdc auth user id bigint NOT NULL DEFAULT nextval cdc auth user id seq regclass cdc
  • 使用键盘快捷键打开浏览器操作的弹出窗口

    我正在开发一个带有浏览器操作弹出窗口的 Google Chrome 扩展程序 当用户单击该图标时 会出现弹出窗口 Is there a way to open this popup with a keyboard shortcut like
  • 如何检查 zip 存档中是否存在文件

    我有 zip 存档 解压后我需要检查 zip 存档中是否存在 moduleConfig xml 我怎样才能做到这一点 我试试这个 zip new ZipArchive if zip gt open test zip TRUE if file
  • 获取 SQL Server 2000 中最后插入的 UNIQUEIDENTIFIER

    The OUTPUT子句与 SQL Server 2005 兼容 但与 SQL Server 2000 不兼容 如何将此命令转换为在 SQL Server 2000 中工作 CREATE TABLE sample ID uniqueiden
  • 线程接收错误参数

    我需要在线程中运行具有给定参数的方法 我注意到当我运行它时 参数错误 对于给出的示例 我有一个数组int output与数字1 7 对于每个数字 我使用以下方法创建一个线程WriteInt i 我希望输出以任意顺序为 1 7 但我始终看到一
  • AWK 输出到 bash 数组

    我试图将一个简单命令的内容放入 bash 数组中 但是遇到了一些麻烦 df h awk print 5 6 给出我的系统上文件系统的使用百分比 输出看起来像这样 1 dev 1 dev shm 1 var run 0 var lock 22
  • ConcurrentDictionary 和 ConcurrentQueue 的这种组合是线程安全的吗?

    我在以下代码中使用 NET 4 中的 ConcurrentDictionary 和 ConcurrentQueue 类 这段代码是线程安全的吗 如果不是 我怎样才能使其线程安全 public class Page public string
  • 如何从 PyQt 中的 QListView 中选择项目

    我是 PyQt 的新手 所以我试图从 QListView 中获取所选项目 我能够获取所选项目的索引 但我无法获取索引的值 请有人帮助我 这是代码 import sys import os from PyQt4 import QtCore Q
  • 通过 COM 从 VC++ 实例化 C# 对象时出现类未注册错误

    在 VC 项目中 我尝试创建 C 项目中包含的 C 类的实例 通过 COM Facts C 和 C 项目均使用 NET 4 0 编译 C dll 正在使用注册regasm 代码库 CSharpProjectName dll 并且 Windo
  • 在canEditRowAtIndexPath方法中,UITableView的reloadData无法正常工作?

    在我的应用程序中 我重新加载 TableView tablView reloadData 从 TableView 中删除行后canEditRowAtIndexPath方法总是调用 透水 总行数 例如 如果我有5我的 TableView 上的
  • Laravel 5 实现多个 Auth 驱动程序

    Synopsis 我正在构建一个至少具有两个身份验证级别的系统 并且两个级别在数据库中都有单独的用户模型和表 在谷歌上快速搜索 迄今为止唯一的解决方案是使用 MultiAuth 包 该包可以在多个驱动程序上安装Auth My goal 我正
  • 可能(x) 和 __builtin_expect((x),1)

    我知道内核使用likely and unlikely宏惊人 宏的文档位于内置函数 long builtin expect long exp long c 但他们并没有真正讨论细节 编译器到底是如何处理的likely x and builti