函数对象的好处?

2024-03-20

我知道STL中使用的函数对象只是简单的对象,我们可以像函数一样操作它。我可以说函数和函数对象的工作原理是相同的。如果这是真的,那么为什么我们应该使用函数对象而不是函数呢?


主要好处是对函数对象(函子)的调用通常是可内联的,而对函数指针的调用通常不是(主要的例子是比较 C 的qsort到 C++ 的std::sort)。对于重要的对象/比较器,C++ 应该杀死 C 的排序性能。

还有其他好处,例如,您可以将状态绑定或存储在函子中,而原始函数则无法做到这一点。

Edit抱歉没有直接参考,但 Scott Meyers 声称在某些情况下改进了 670%:qsort 与 std::sort 的性能比较? https://stackoverflow.com/questions/4708105/performance-of-qsort-vs-stdsort

Edit 2附有表演笔记的段落是这样的:

函数指针参数禁止内联这一事实解释了 长期 C 程序员常常难以相信的观察结果: 当涉及到以下问题时,C++ 的排序实际上总是让 C 的 qsort 感到尴尬 速度。当然,C++ 有函数和类模板来实例化和 看起来很有趣的operator()函数可以在C创建一个简单的函数时调用 函数调用,但所有 C++“开销”都被吸收了 汇编。在运行时,sort 对其比较进行内联调用 函数(假设比较函数已被声明为内联 并且它的主体在编译期间可用),而 qsort 调用它的 通过指针的比较函数。最终的结果是这样的 跑得更快。在我对一百万个双打向量的测试中,它跑了 速度提高了 670%,但不要相信我的话,你自己尝试一下。它是 在比较函数对象和真实函数时很容易验证 作为算法参数,有一个抽象的好处。

-Scott Meyers "Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library" - Item 46
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数对象的好处? 的相关文章

随机推荐

  • 统计模型逻辑回归收敛问题

    我正在尝试在大型设计矩阵 约 200 列 上的 statsmodels 中运行逻辑回归 这些特征包括大量交互 分类特征和半稀疏 70 整数特征 虽然我的设计矩阵不是actually病态的 似乎有些接近 根据numpy linalg matr
  • kv 语言的 Kivy 屏幕管理器参考

    我正在尝试制作一个主菜单 让我在单击按钮时切换屏幕 但我不知道如何从按钮引用管理器 我有一个主菜单页面的设置 在 kv 文件中
  • Rails // 白天按时区查询

    在使用时区方面不太有信心 在这方面寻求一些帮助 我有一个 cron 作业 每隔一段时间检查一次用户 它调用 rake 任务 在此 rake 任务中 我查询用户并根据条件向每个用户发送一封电子邮件 我有每个用户的时区信息 我想对那些仅返回当前
  • Gnuplot BibTeX 引用

    好吧 这不是一个正确的编程问题 但也许答案会对其他人有所帮助 我一直在尝试寻找合适的 BibTeX 条目gnuplot 包含在科学出版物中 我只是不想引用任何指南书 而是引用实际的软件 有谁有想法或曾经使用过吗 我希望找到类似的东西cita
  • fread():读取以 \r\r\n 作为换行符的表

    我在文本文件中有制表符分隔的表 其中所有行都以 r r n 0x0D 0x0D 0x0A 如果我尝试读取这样的文件fread 它说 行结尾为 r r n R 的 download file 似乎添加了额外的 r 在 Windows 上的文本
  • Java Velocity引擎初始化问题

    我写了一个包含邮件构建部分的库 该邮件构建部分使用了 Velocity mailbuilder 类如下 public class mailBuilder public void initialize throws Exception Pro
  • 我们如何测试某物是否是参考?

    现在我正在使用这个 instance clojure lang IDeref x 但我怀疑可能有更好 更惯用的方法来做到这一点 这是不正确的 您正在检查对象 x 是否实现了 IDeref 接口 这仅仅意味着您可以使用 符号取消引用该对象 你
  • xsd.exe 生成的类可为空值

    我一直在使用 xsd exe 生成一个用于反序列化 XML 的类 我在源 xsd 中有不需要的十进制值
  • Angular 5 视图超时后不更新

    我在 Angular 5 中设置了一个超时 在一段时间后隐藏元素 this showElement true setTimeout function console log hide this showElement false 2000
  • 适用于 Mac 的单击一次部署

    正如标题所述 是否有与 Mac 上的 Click Once 应用程序部署等效的方法 我问这个问题是因为 Lion 附带的 Safari 版本已删除 DMG 磁盘映像 文件作为下载后打开的 安全文件类型 我工作的公司有一个相当特殊用途的应用程
  • 通过 BlackBerry 发送 POST 数据后获取 HTML 响应

    我需要在发送 POST 数据后从 URL 读取 HTML 响应 我已经有以下两个函数 但我不知道如何组合它们 以便我可以发送 POST 数据并获取响应 此函数获取标准 HTML 响应 public static String getData
  • Java Rest api 需要等待才能处理

    我有一个 Java Rest API 物联网设备将使用它来发送数据 每个设备都有一个时间段 比如 15 秒 与 API 进行通信 在该时间段内 可以有多个具有相同数据集的消息 我想要做的是 当 API 从设备接收到新消息时 它会等到时间段结
  • basic_ostringstream::str 悬空指针

    最近我发现了以下代码中的错误 ostringstream o o lt lt some string const char s o str c str empty string instead of expected some string
  • librosa.effect.Split的返回值很奇怪

    正如标题所示 这个函数的结果不符合逻辑 我不明白这个函数在做什么 例如 这里是一些可重现的代码 load sample audio filename librosa util example audio file audio sr libr
  • 推送到远程分支(无法更新引用)

    我有一个带有功能 初始更改分支的远程存储库 现在我想将一些文件从本地功能 初始更改分支推送到此远程分支 我浏览了一些关于推送到远程分支的帖子并尝试了一些方法 但我仍然遇到相同的错误 添加并提交后 我得到以下 git 状态 Sakibs Ma
  • Azure WebJobs SDK 服务总线死信队列

    使用 WebJobs SDK 时 将 BrokeredMessage 移动到死信队列的正确方法是什么 通常我只会调用 msg DeadLetter 但是 SDK 负责管理代理消息的生命周期 如果方法返回成功 它将调用 msg Complet
  • 如何在按下按钮后以动画方式显示 UIPickerView?

    我想在按下按钮后为 UIPickerView 制作动画 我已经将 UIPickerView 编码为隐藏在 viewDidLoad 上 并且在按下按钮后不会隐藏 但它的动画效果不像 ModalViewController 默认情况下的动画效果
  • 包更新到 Angular 5 最新版本,但 npm 未使用 Angular 模板在 Visual Studio 2017 中更新

    我已将 Visual Studio 2017 模板中的 Angular 4 更新为 Angular 5 我按照链接中的说明进行操作http www talkingdotnet com upgrade Angular 4 app Angula
  • 如何计算滚动 idxmax

    考虑pd Series s import pandas as pd import numpy as np np random seed 3 1415 s pd Series np random randint 0 10 10 list ab
  • 函数对象的好处?

    我知道STL中使用的函数对象只是简单的对象 我们可以像函数一样操作它 我可以说函数和函数对象的工作原理是相同的 如果这是真的 那么为什么我们应该使用函数对象而不是函数呢 主要好处是对函数对象 函子 的调用通常是可内联的 而对函数指针的调用通