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() 的性能问题 的相关文章

  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 更快地评估从右到左的矩阵乘法

    我注意到以二次形式评估矩阵运算右到左明显快于左到右在 R 中 取决于括号的放置方式 显然它们都执行相同的计算量 我想知道为什么会这样 这与内存分配有什么关系吗 A 5000 5000 B 5000 2 A matrix runif 5000
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

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

    我在向部署在 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