C++ 循环中向量::size() 的性能问题

2023-12-06

在下面的代码中:

std::vector<int> var;
for (int i = 0; i < var.size(); i++);

Is the size()每次循环迭代都调用成员函数,还是只调用一次?


理论上,每次都会调用它,因为 for 循环:

for(initialization; condition; increment)
    body;

被扩展到类似的东西

{
    initialization;
    while(condition)
    {
        body;
        increment;
    }
}

(注意大括号,因为初始化已经在内部作用域中)

在实践中,如果编译器理解您的条件的一部分在整个循环期间保持不变并且它没有副作用,它可以足够聪明地将其移出。这通常是用strlen以及类似的事情(编译器很清楚)在没有写入其参数的循环中。

然而必须注意的是,最后一个条件的证明并不总是微不足道的。一般来说,如果容器是函数的本地容器并且从不传递给外部函数,那就很容易;如果容器不是本地的(例如,它是通过引用传递的 - 即使它是const)并且循环体包含对其他函数的调用,编译器通常必须假设这些函数可能会改变它,从而阻止长度计算的提升。

如果您知道条件的一部分评估起来“昂贵”,那么手动进行优化是值得的(而这样的条件通常不是,因为它通常归结为指针减法,这几乎肯定是内联的)。


Edit:正如其他人所说,一般来说,对于容器来说,最好使用迭代器,但是对于vector这并不重要,因为通过随机访问元素operator[]保证为 O(1);实际上,对于向量,它通常是指针和(向量基数+索引)和解引用与指针增量(前一个元素+1)和迭代器的取消引用。由于目标地址仍然相同,我认为您无法从缓存局部性方面从迭代器中获得一些东西(即使是这样,如果您没有在紧密循环中遍历大数组,您甚至不应该注意到这样的情况)种改进)。

对于列表和其他容器,可以使用迭代器而不是随机访问really重要的是,因为使用随机访问可能意味着每次都遍历列表,而递增迭代器只是指针取消引用。

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

C++ 循环中向量::size() 的性能问题 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Windows 和 Linux 上的线程

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

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

随机推荐

  • 谷歌云:身份验证范围不足

    我在向部署在 Google Cloud Kubernetes 集群中的 Spring Boot 应用程序发送请求时遇到困难 我的应用程序收到一张照片并将其发送到 Google Vision API 我正在使用提供的客户端库 https cl
  • 对工作流程进行故障排除,将上游更改合并到分叉存储库中

    我分叉了一个 git 存储库 然后创建了一个名为 strlen 的分支 提交 PR 并做出建议的更改后 以下是我尝试合并上游更改的尝试 A 部分 从上游获取并合并 git fetch upstream git merge upstream
  • 使用 Javascript 函数重新加载 HTML 元素

    我有一个嵌入在 DIV 中的 Flash 对象 现在我想使用该 div 上方的链接 a 标签 以便用户能够重新加载该 flash 拨号器 或更具体地说是它包含的 div 标签 我无法以任何方式更改 flash 文件 我尝试过使用下面的 JS
  • 32 位系统的 INT 最大大小

    假设我们正在谈论 32 位系统 PHP 不支持无符号 INT 这意味着 INT 值应介于 2 147 483 648 和 2 147 483 647 值之间 INT 需要 4 个字节来存储 32 位长度的值 那么这是否意味着我只有 31 位
  • OLEDB 连接支持超过 65536 行(从 Excel 工作表更新访问)

    我可以使用以下 SQL 命令从 Excel 工作表中选择要插入到 Access 表中的数据 SELECT FROM Excel 12 0 HDR YES DATABASE K FolderName FileName xlsb SheetNa
  • 用户数据的数据仓库-设计Q

    如何最好地存储用户数据与日期 时间维度 用例是我试图存储每天 每小时的用户操作 例如分享数 喜欢数 好友数等 我有一个时间表和日期表 对于时间来说很简单 我每天的每个小时的每一行 user id 和列 1 到 24 但问题在于日期 如果我每
  • 如何在 Laravel 中使用 JQuery (NPM)

    我是 Web 开发新手 我使用 Laravel 框架 我使用 npm 来处理包 但现在我在实现 JQuery 时遇到了问题 Bootstrap 已应用于幼虫并且有效 在我的 Laravel 项目中是在 package json 中 devD
  • 安装后尝试打开 Spark 并出现错误:无法找到任何与版本“1.8”匹配的 JVM

    描述 我在 MacBook 上安装了 Spark 然后使用Homebrew 我按照以下指示流程进行操作 https www tutorialkart com apache spark how to install spark on mac
  • 重构现有系统的可测试性

    我加入了一个开发产品的团队 该产品已经存在了大约 5 年 并且使用 ASP NET WebForms 随着时间的推移 它的原始架构已经褪色 整个解决方案变得相对混乱 这绝不是可怕的 但绝对需要一些工作 你们都知道我的意思 自从大约 6 个月
  • 选择/排除 pandas 中的列集[重复]

    这个问题在这里已经有答案了 我想根据列选择从现有数据帧创建视图或数据帧 例如 我想创建一个数据框df2来自数据框df1它包含除其中两列之外的所有列 我尝试执行以下操作 但没有成功 import numpy as np import pand
  • 使用 Grand Central Dispatch 时如何发布 NSNotification?

    我发现 正如预测的那样 当我将图像写入文件时 我的 UI 在这段时间内被阻止 这是不可接受的 当我将图像写入文件时 我会发布 NS 通知 以便我可以执行与该完成相关的其他一些特定工作 原始工作但 UI 阻塞代码 void saveImage
  • 所有磁盘扇区在汇编中是如何迭代的?

    在学习汇编的过程中 我正在编写一个操作系统 我已经成功编写了将第二个 512 字节扇区附加到初始 512 字节引导加载程序所需的代码 define KBDINT 0x16 define VIDINT 0x10 define DISKINT
  • 同一域的 Django 和 Node 进程

    嗨我有两个过程 Django 和 MYSQL 节点 express 和 mongodb 1 如何配置这两个进程指向不同的 url 喜欢 Django 指向 api abc com v1 节点指向 api abc com v2 2 我所有的用
  • Windows Phone 8 设备作为感应门禁卡

    Lumia 920 中的 NFC 硬件可以模拟 125 kHz 感应卡吗 看起来 NFC 硬件实现的标准是门禁卡使用的标准的超集 但我对这些无线电标准没有足够的了解 无法理解手机是否只能作为此类信号的接收器或发射器 我还希望获得一篇很好的概
  • 从文件中读取数字C++

    我想从文本文件中读取数字 该文件包含以下数字 3 5 7 9 20 25 30 40 55 56 57 60 62 1 4 7 11 14 25 44 47 55 57 100 5 100 1000 1005 12 1000 1001 空格
  • 在 Node.js 中同时生成的发票具有相同的编号。如何实现独特性?

    在我的 Node js 应用程序中 我想启用生成带有发票的 PDF 的功能 一切都很顺利 直到两个或更多人同时 在不同的机器上 生成发票 然后 系统会提示他们提供具有相同编号的不同发票 例如发票号码 355 这是将发票保存到MySQL的方法
  • 无法编译 yesod,hGetContents 参数无效

    我正在尝试创建 Yesod 项目 但无法退出1st step 以下是我初始化和构建的步骤 stack new someproj yesodweb postgres cd someproj stack build 我没有做任何额外的编码 只是
  • 解析 R 脚本中的命令行参数

    有没有方便的方法来自动解析传递给 R 脚本的命令行参数 类似perl的东西Getopt Long CRAN上有3个包 getopt 类似 C 的 getopt 行为 optparse 受 Python 启发的命令行解析器optparse l
  • 如何在变量中取加号

    我想计算两个数字 这很简单 但是有什么办法可以将运算符放入变量中然后进行计算吗 var x 5 var y 5 var p var z x p y button click function alert z div class button
  • C++ 循环中向量::size() 的性能问题

    在下面的代码中 std vector