如何编写无分支 std::vector 扫描?

2024-03-02

我想对数组编写一个简单的扫描。我有一个std::vector<int> data我想找到元素小于 9 的所有数组索引并将它们添加到结果向量中。我可以使用分支来编写:

for (int i = 0; i < data.size(); ++i)
    if (data[i] < 9)
        r.push_back(i);

这给出了正确的答案,但我想将其与无分支版本进行比较。

使用原始数组 - 并假设data是一个 int 数组,length是其中的元素数量,并且r是一个有足够空间的结果数组 - 我可以写如下内容:

int current_write_point = 0;
for (int i = 0; i < length; ++i){
    r[current_write_point] = i;
    current_write_point += (data[i] < 9);
}

我如何使用向量获得类​​似的行为data?


我们来看看实际情况编译器输出 https://godbolt.org/g/yB0bSg:

auto scan_branch(const std::vector<int>& v)
{
  std::vector<int> res;
  int insert_index = 0;
  for(int i = 0; i < v.size(); ++i)
  {
    if (v[i] < 9)
    {
       res.push_back(i);
    } 
  }
  return res;
}

这段代码显然在第 26 行有一个分支拆卸 https://godbolt.org/g/yB0bSg。如果它大于或等于 9,它只会继续处理下一个元素,但是如果小于 9,则会为 push_back 执行大量代码,然后我们继续。没什么意外的。

auto scan_nobranch(const std::vector<int>& v)
{
  std::vector<int> res;
  res.resize(v.size());

  int insert_index = 0;
  for(int i = 0; i < v.size(); ++i)
  {
    res[insert_index] = i;
    insert_index += v[i] < 9;
  }

  res.resize(insert_index);
  return res;
}

然而,这个只有一个条件移动,你可以在第 190 行看到这一点。拆卸 https://godbolt.org/g/yB0bSg。看来我们有赢家了。由于条件移动不会导致管道停顿,因此该分支中没有分支(除了 for 条件检查)。

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

如何编写无分支 std::vector 扫描? 的相关文章

  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 重载<<的返回值

    include
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用日期 Swift 3 对字典数组进行排序

    我有一个名为 myArray 的数组 其中添加了字典 我希望该字典按时间排序 这是字典中的键 那个时间是在 String 中 时间的日期格式为 yyyy MM dd HH mm ss 我尝试使用下面的代码解决方案 但给出了 从 字符串转换
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • JavaScript 正则表达式三部分

    我需要有关 JavaScript 中正则表达式的帮助 抱歉 我仍在努力学习它 我有字符串 value1 value2 value3 value4 value5 value6 三个部分中的每一个都可以有无穷大的值 我需要分开 var1 val
  • IOAuth.IO 与 Ionic/Angular 混合应用程序集成

    我很难获得 OAuth io 编写的 cordova 插件 https github com oauth io oauth phonegap https github com oauth io oauth phonegap 在 ionic
  • 数据绑定到实现 IEnumerable 的对象的属性

    我正在尝试对对象的实例进行简单的数据绑定 像这样的东西 public class Foo INotifyPropertyChanged private int bar public int Bar snip code to get set
  • 如何自动启动所需的服务和应用程序?

    我正在编写我的第一个 erlang 应用程序 我想按照在 erlang 生态系统中应该完成的方式做事 我的应用程序依赖于已启动的 ssl inets 服务和 log4erl 应用程序 目前我在 erlang shell 中手动启动它们 之后
  • WPF MVVM prism 中的 ASP.net 类似基于表单的身份验证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在开发 WPF MVVM prism 应用程序后 我想实现身份验证 因为它是基于 ASP NET 表单的身份验证 我想限制用户进入需要授权
  • 支持不可变类的 ORM

    哪个 ORM 支持以下领域模型不可变的 types 我想编写如下所示的类 或 Scala 等效项 class A private final C c not mutable A B b init c A doSomething B b bu
  • 更新由另一个减速器管理的状态

    在我的 React 应用程序中 我的appReducer管理全局内容 例如通知 用户信息等 应用程序中的模块之一是库存模块 它有自己的减速器 即inventoryReducer 在 redux 商店中 我组合了所有减速器 当用户输入库存时
  • FactoryGirl 创建用户,但保存点在测试开始前被释放

    我正在为spec requests user pages specs运行rspec测试 require spec helper describe User pages do subject page describe home page d
  • 我可以从 Chrome 扩展程序访问站点的 localStorage 吗?

    我的 chrome 扩展有两种状态 1 某些站点在localStorage 另一个域 中有身份验证数据 所以我必须显示主窗口 2 没有身份验证数据 因此我必须显示带有登录名和密码表单的窗口 为了定义是否提供身份验证数据 我想检查他的 loc
  • 如何使用pdfkit ios 11打开pdf文件?

    我正在尝试使用新的 iOS 11 框架 pdfkit 打开 PDF 文件 但我无法做到这一点 所以帮助我使用 pdfkit 框架打开文件 先感谢您 这是基于 Objective C 的示例 Ensure PDFKit framework i
  • 推送通知警报文本的最大长度是多少?

    iOS 推送通知的警报文本的最大长度是多少 The 文档 https developer apple com go id push notifications指出通知有效负载总共必须低于 256 字节 https developer app
  • PWA 的推送通知或 Web 推送通知

    首先 我想说我一直在研究推送通知和网络通知 但我有点困惑 我从这里读到 PWA 的推送通知不适用于 Safari 上的 iOS iPhone 从 PWA 向 iOS 发送推送通知 https stackoverflow com questi
  • 如何拥有一个写入服务总线队列的异步函数?

    使用 Azure WebJobs SDK 我想创建一个异步函数 该函数将接收 ServiceBus 队列输入并写入 ServiceBus 队列输出 异步方法不能有 out 参数 例如在 BlobStorage 上 似乎可以通过使用 Stre
  • 解析 nmap 结果

    我正在 Linux 上使用 Python 2 6 开发一个项目 我在终端使用 nmap 来获取这些扫描结果 我在一个字符串中得到了这个结果 Starting Nmap 6 47 http nmap org at 2015 06 28 23
  • 创建 AMI 需要很长时间

    我正在为具有 100G 文件的服务器创建 AMI 已经过去一个多小时了 事情还没有结束 AMI 仍然显示待处理 有什么问题吗 我应该怎么办 只是为了让其他人知道 这个过程可能需要非常非常长的时间 我的 100 GB AMI 大约需要 2 5
  • Excel 2010:查找两个日期时间之间的秒数

    我有一个专栏Cal Date time 其中包含通话的日期和时间 如下所示 A B C D Number Call Date Time Duration in Sec 123 2010 01 10 01 07 24 465000 123 2
  • Android 中应用程序“资产”文件夹的路径是什么?

    我正在开发一个 Android 应用程序 希望在 apk 中捆绑一个视频文件 mp4 以便在启动应用程序时我可以播放简短的介绍视频 不幸的是 我无法弄清楚应该将该视频文件放置在项目文件夹中的哪个位置 以及如何访问它 文件的路径 我在用vid
  • Pandas:iterrow 循环的替代方案

    我有一个在 pandas 中运行的小函数 当我运行时会抛出 ValueErrorif x in y陈述 我看到了类似的问题 建议使用布尔索引 isin and where 但我无法将任何示例适应我的情况 任何建议将非常感激 附加说明 gro
  • jQuery :包含 html

    我有一个表 其中包含逗号分隔的数字列表 如下所示 td 72 76 81 td 我正在尝试选择表格单元格don t包含特定的数字 该选择器有效 td not contains 76 table 问题是可能存在包含 576 或 761 等的行
  • 如何编写无分支 std::vector 扫描?

    我想对数组编写一个简单的扫描 我有一个std vector