使用 C++11 的“auto”如何提高性能?

2023-12-01

我明白为什么autoC++11 中的类型提高了正确性和可维护性。我读到它还可以提高性能(几乎总是自动作者:Herb Sutter),但这部分缺乏很好的解释。

  • How can auto提高性能?
  • 谁能举个例子吗?

auto可以通过以下方式提高性能避免静默隐式转换。我觉得引人注目的一个例子如下。

std::map<Key, Val> m;
// ...

for (std::pair<Key, Val> const& item : m) {
    // do stuff
}

看到错误了吗?在这里,我们认为我们正在通过 const 引用优雅地获取映射中的每个项目,并使用新的 range-for 表达式来明确我们的意图,但实际上我们正在复制every元素。这是因为std::map<Key, Val>::value_type is std::pair<const Key, Val>, not std::pair<Key, Val>。因此,当我们(隐含地)有:

std::pair<Key, Val> const& item = *iter;

我们必须进行类型转换,而不是获取对现有对象的引用并保留它。只要有可用的隐式转换,您就可以对不同类型的对象(或临时对象)进行常量引用,例如:

int const& i = 2.0; // perfectly OK

类型转换是允许的隐式转换,其原因与您可以转换const Key to a Key,但我们必须构造一个新类型的临时对象才能实现这一点。因此,我们的循环实际上是:

std::pair<Key, Val> __tmp = *iter;       // construct a temporary of the correct type
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it

(当然,实际上并没有__tmp对象,它只是为了说明,实际上未命名的临时对象只是绑定item在其生命周期内)。

只需更改为:

for (auto const& item : m) {
    // do stuff
}

刚刚为我们节省了大量的副本 - 现在引用的类型与初始值设定项类型匹配,因此不需要临时或转换,我们可以直接进行引用。

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

使用 C++11 的“auto”如何提高性能? 的相关文章

  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • Android Drawable 绘图性能?

    在我看来 我有一个简单的 ARGB 可绘制对象 大约需要 2 毫秒才能绘制 但我可以在 0 5 毫秒内绘制与位图相同的文件 只是一些快速代码 我真的不能认为它是一个选项 优化可绘制对象的绘制速度的最佳方法是什么 这取决于可绘制的数量以及每个
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 如何在win32中使用GetSaveFileName保存文件?

    我编写此代码是为了获取 fileName 来保存我的文件 include stdafx h include
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • “必须声明标量变量”错误[重复]

    这个问题在这里已经有答案了 必须声明标量变量 Id SqlConnection con new SqlConnection connectionstring con Open SqlCommand cmd new SqlCommand cm
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12

随机推荐

  • 如何从R中UNC指定的目录中读取文件?

    是否可以从 UNC 指定的目录中读取文件R 我想在不使用基本安装之外的任何软件包的情况下完成此操作 UNC 名称工作正常 您只需正确转义它们即可 这对我有用 read csv COMPUTER Directory file txt
  • 我如何在 QMake 中包含 python.h

    INCLUDEPATH L usr include python2 7 LIBS usr local lib python2 7 QMAKE CXXFLAGS usr local lib python2 7 error cannot fin
  • C++程序与MySQL数据库通信

    有谁知道 C 程序直接与 MySQL 数据库通信的简单方法吗 我查看了 MySQL 发现它非常令人困惑 如果有人知道一个非常简单的方法 请告诉我 Thanks 附 我正在 Windows 机器上进行开发 PHP 和 MySQL Web 应用
  • LINQ Intersect 不返回项目

    我已经为我的自定义类实现了一个比较类 以便我可以使用Intersect在两个列表中 StudentList1 and StudentList2 但是 当我运行以下代码时 我没有得到任何结果 Student class CompareStud
  • awk 要求合并两个文件

    我通过 AWK 命令使用 Same Key 组合了两个不同的文件 如果与 File1 和 File2 相比没有关键匹配 则只需 把 t t t 代替 我有以下 AWK 命令 awk F t key 1 NR 1 header key key
  • 为什么不能将 Dictionary> 转换为 Dictionary>?

    我想知道为什么我不能直接进行强制转换 我有一个模糊的想法 这可能与协 逆变的东西有关 我是否被迫按顺序将第一个字典的元素复制到新的字典中得到我想要的类型 你不能这样做 因为它们不是同一类型 考虑 var x new Dictionary
  • 不使用模式名称访问表

    我是 DB2 新手 如果不使用架构名称 我无法从表中获取数据 如果我使用带有表名的模式名称 我就可以获取数据 Example SELECT FROM TABLE NAME 它给了我错误 同时 SELECT FROM SCHEMA NAME
  • 如何在Python OpenCV中获取轮廓的x,y位置

    我试图从下图中获取轮廓的 x 和 y 位置 但我搞砸了 图片 我只需要找到轮廓的 x 和 y 位置或轮廓的中心 当我从 GIMP 手动查找它们的位置时 结果将类似于以下内容 290 210 982 190 570 478 我相信可以用 cv
  • 从 C# 调用非托管 C++ 库 (dll) 会产生访问冲突错误 (0xc0000005)

    抱歉问了这么长的问题 我只是想包括我目前所知道的有关该问题的所有信息 我正在使用 Visual Studio 2008 用 C 创建一个 Windows 窗体程序 该程序调用用 C 编写的库 C DLL 分析由多个样本组成的测量数据 样本通
  • 使用php脚本将多个doc或rtf文件合并为一个doc或rtf文件

    我想将多个 doc 或 rtf 文件合并到一个文件中 该文件应该与多个文件的格式相同 我的意思是 如果用户从列表框中选择多个 rtf 模板文件并单击网页上的按钮 则输出应该是组合多个 rtf 模板文件的单个 rtf 文件 我应该使用 php
  • 使用 TypeScript 将箭头函数分配给泛型函数类型

    我已经对类似问题进行了一些挖掘 但找不到有效的解决方案 我有一些类型的通用函数 但我似乎无法正确实现它们 简而言之 我有这个 Takes three values of the same type and collapses them in
  • Visual Studio 2010 无法加载导入了 元素的项目

    我们有一个大型 约 800 个单独的项目 系统 我们正在将其从旧的构建系统迁移到 Visual Studio 2010 在过去的几周里 我们为每个项目手动创建了 Visual Studio 项目文件 vcxproj 格式 我们可以仅使用 M
  • UnreachableBrowserException:无法启动新会话。可能的原因是 Selenium Grid 远程服务器的地址无效

    打开新驱动程序窗口时出错 org openqa selenium remote UnreachableBrowserException Could not start a new session Possible causes are in
  • 无法在 Keras 中使用 VGG19 预测单个图像的标签

    我正在根据 本教程 使用迁移学习方法在 Keras 中使用经过训练的 VGG19 模型https towardsdatascience com keras transfer learning for beginners 6c9b8b7143
  • 如何在页面加载时显示运行进度条

    我想在页面加载时显示运行进度条像这儿 在我的页面中 我在示例中使用了一个简单的加载图像 但我想在运行进度栏中将其转换 这是我的代码 window load function alert hi loading hide loading wid
  • 从字符串返回数字

    我正在尝试提取下面字符串中 Humans 的 Number 例如 string lt c ProjectObjectives Objectives NA PublishDate PublishDate NA DeploymentID Dep
  • 我应该在基于 HornetQ 的应用程序中只使用一个会话吗?

    在基于HornetQ引擎的应用程序中 我打算创建多个生产者和消费者 我了解到 我应该尽可能地重用资源 这要归功于这一页 这是否意味着 对于我的应用程序 我应该创建一个且恰好一个 ConnectionFactory 一个 Connection
  • 如何使用Python 2.6和minidom添加xml样式表处理指令节点?

    我正在使用 minidom 创建 XML 文档 如何确保生成的 XML 文档包含如下样式表引用 Thanks 使用这样的东西 from xml dom import minidom xml
  • 适用于 Froyo 的 Android ParcelFileDescriptor.createPipe()?

    我有需要使用ParcelFileDescriptor createPipe 但我仍然想以 API 8 Froyo 为目标 此功能需要 API 9 Gingerbread 我读到有一些兼容性套件允许在较旧的操作系统版本上使用较新的 API 函
  • 使用 C++11 的“auto”如何提高性能?

    我明白为什么autoC 11 中的类型提高了正确性和可维护性 我读到它还可以提高性能 几乎总是自动作者 Herb Sutter 但这部分缺乏很好的解释 How can auto提高性能 谁能举个例子吗 auto可以通过以下方式提高性能避免静