仿函数调用和函数调用的详细区别?

2024-03-02

这样做的关键原因是 for_each () 实际上并没有假设它的第三个参数是一个函数。 它只是假设它的第三个 论证是可以的 用适当的参数调用。 A 适当定义的对象也可以 作为——而且往往比——更好 功能。例如,更容易 内联应用程序运算符 类而不是内联传递的函数 作为函数指针。 因此,函数对象经常 比普通人执行得更快 功能。一个类的对象 应用程序运营商(§11.9)是 称为类函数对象, 函子,或者简称为函数对象。

[Stroustrup,C++ 第三版,18.4-最后一段]

  1. 我一直以为操作员 ( )call 就像函数调用一样 在运行时。它与什么不同 正常的函数调用?

  2. 为什么内联更容易 应用程序操作员比普通操作员 功能?

  3. 它们如何比函数更快 称呼?


一般来说,函子被传递给模板化的函数 - 如果您这样做,那么传递“真实”函数(即函数指针)或函子(即具有重载的类)并不重要operator())。本质上,两者都有一个函数调用运算符,因此都是有效的模板参数,编译器可以为其实例化for_each模板。这意味着for_each要么用特定的实例化type函子的传递,或与特定type传递了函数指针。正是在这种专业化中,函子有可能胜过函数指针。

毕竟,如果你正在通过函数指针,那么参数的编译类型就是函数指针。如果for_each本身不是内联的,那么这个特定的for_each实例被编译为调用不透明的函数指针 - 毕竟,编译器如何内联函数指针?它只知道它的type, not which该类型的函数实际上是被传递的——至少,除非它在优化时可以使用非局部信息,而这是很难做到的。

但是,如果您通过了functor,然后该函子的编译时类型用于实例化for_each模板。这样做时,您可能会传递一个简单的非虚拟类,其中只有一个适当的实现operator()。因此,当编译器遇到调用时operator()它确切地知道意味着哪个实现 - 该函子的唯一实现 - 现在它可以内联它。

如果您的函子使用虚方法,则潜在优势就会消失。当然,函子是一个类,您可以用它来做各种其他低效的事情。但对于基本情况,这就是为什么编译器优化和内联函子调用比函数指针调用更容易的原因。

Summary

编译时函数指针无法内联for_each编译器只有类型 函数而不是函数的恒等式。相比之下,函子可以内联,因为即使编译器只有函子的类型,该类型通常足以唯一地标识函子的类型。operator() method.

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

仿函数调用和函数调用的详细区别? 的相关文章

  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问

随机推荐

  • 在 XAML 绑定表达式中使用变量

    我正在构建一个可以编辑 POCO 的控件 POCO 中有一个需要编辑的字段的描述符集合 我正在绑定一个ListBox s ItemsSource到这个集合 除其他外 描述符使我能够选择合适的DataTemplate以及 POCO 中的变量名
  • 周期可调的PRNG

    我需要构建一个周期可调的就地伪随机数生成器 另外 在一段时间内不得发生碰撞 也就是说 以下内容必须返回 true prng is generated at run time though a by hand solution would w
  • 如何克服导航栏的影响

    在我的应用程序中 我想在转到上一个视图时隐藏导航栏 并且我在 viewwiilldisaapper 方法中隐藏导航栏 但效果仍然存在 意味着它在弹出时显示白屏 那么任何人都可以告诉我解决方案吗 谢谢大家 您需要使用隐藏该页面 viewWil
  • 滚动然后对齐到顶部

    只是想知道是否有人知道我如何重新创建我不久前看到的导航栏样式 我刚刚找到了我在上面看到的网站 但不确定他们是如何到达那里的 基本上希望它随页面滚动然后锁定到顶部 http lesscss org http lesscss org 只需快速
  • iOS 中 @property 的默认值是多少?

    iOS 中 property 的默认值是什么 例如 如果我声明 property NSString Photographer 是默认值 分配 还是 保留 还是其他什么 原子 非原子 我无法从文档中找到此信息 谢谢 我相信默认值是 atomi
  • sklearn.impute.IterativeImputer 的实现

    考虑data其中包含以下一些 nan Column 1 Column 2 Column 3 Column 4 Column 5 0 NaN 15 0 63 0 8 0 40 0 1 60 0 51 0 NaN 54 0 31 0 2 15
  • 相交并合并两个对象数组

    我有两个数组 var odd name 1 extraProp1 propValue1 name 3 extraProp1 propValue2 var even name 1 extraProp2 prop1 name 2 extraPr
  • Javascript 未捕获类型错误:.split 不是函数

    我想做一个功能 用户每天只能领取一次硬币 我做了这个功能 split这样它就只比较日期Date 仅比较日期和时间 但是 我收到了这个 JavaScript 错误 未捕获的 TypeError 中间值 split 不是函数 有人知道如何解决这
  • 如何在主目录上撤消 git init ?

    I did git init and git add 在我的主目录中 我认为这减慢了每个操作的速度 因为该目录太大了 我怎样才能撤消git init主目录的 你可以这样做rm rf HOME git删除 git 存储的所有版本控制信息 这会
  • Python:每月的第三个星期五

    我是一个菜鸟Python程序员 我需要编写一个脚本来检查给定日期 以 月 日 年 形式作为字符串传递 是否是该月的第三个星期五 我正在使用Python 2 7 例如 这些日期可以帮助您更好地理解我的问题 手头有一份年度日历 输入 gt 输出
  • LINQ(或伪代码)按邻近度对项目进行分组

    有谁能够启发我如何使用 LINQ 或者必要时更合适的东西 来创建一个整数列表列表 这些整数列表按彼此的接近程度进行分组 基本上 我想创建组中的数字与任何其他数字在 5 以内 所以 给定 3 27 53 79 113 129 134 140
  • Inno Setup 查找子文件夹

    是否有办法获取目录中的所有 或仅第一个 子文件夹 我正在尝试将文件安装到具有动态名称的子目录中 它不是 Inno Setup 可用的常量之一 有办法找到这个子目录名吗 那么 要获取某个文件夹中第一个找到的子文件夹的名称 无论它是哪个 您可以
  • 将不需要的值替换为最接近且恰好为正的索引值

    这个问题与上一个问题不同 如何找到具有负值的索引并将该值替换为最接近的正值索引值 https stackoverflow com questions 59742108 how to find indices with a negative
  • 设置 NSStreamNetworkServiceTypeBackground “幕后作用”是什么?

    我有一个内部应用程序 不适用于 iPhone 商店分发 因此不受 Apple 批准 它需要在运行时保持少量 TCP 和 UDP 套接字绑定 在测试时 我注意到我的绑定套接字有一些奇怪的行为 只要设备进入睡眠状态 它就会关闭 例如 当您按下手
  • 设置为 Theme.NoTitleBar.Fullscreen 后应用程序崩溃

    如果我不取消标题栏 我的应用程序就会启动 但是当我取消标题栏时 它一启动就会崩溃 这是我到目前为止的代码 xml version 1 0 encoding utf 8 gt
  • 在 Angular 7 中使用 getElementById 在 DOM 元素上应用指令

    我有一些由第三方 plotly 生成的 HTML 我很想在它创建的 DOM 元素之一上应用我们已有的指令 该指令在单击时打开一个 colorPicker 并将颜色设置为字符串 我可以通过以下方式到达元素querySelector or ge
  • 英特尔 MKL 错误:参数 6 输入时不正确

    我收到以下错误 Intel MKL ERROR Parameter 6 was incorrect on entry to DGELSD 在 scipy 上运行 Savitzky Golay 过滤器时 函数scipy signal savg
  • 测试 IntegrityError UNIQUE 约束失败

    我对电子邮件和商店有一个 unique together 约束 我使用以下代码来测试唯一约束 我期望通过assertRaise 测试 但结果显示相反 我在这里缺少什么 from django db backends sqlite3 base
  • 散景,仅在单个轴上缩放,相应地调整另一个轴

    如何使散景仅在一个轴上使用缩放并自动缩放对象 以便它们精确地占据给定的空间 并在可缩放轴平行的极值点上添加一些填充 同时将空白空间渲染到范围之外 换句话说 准确地说是 疯狂技能 示例图 https i stack imgur com I3j
  • 仿函数调用和函数调用的详细区别?

    这样做的关键原因是 for each 实际上并没有假设它的第三个参数是一个函数 它只是假设它的第三个 论证是可以的 用适当的参数调用 A 适当定义的对象也可以 作为 而且往往比 更好 功能 例如 更容易 内联应用程序运算符 类而不是内联传递