在 C++ 中,编译器“内联”函数对象意味着什么?

2024-01-10

在维基百科中它表示此类对象与 for_each 一起使用时具有性能优势,因为编译器可以“内联”它们。

我对这在这种情况下的确切含义有点模糊……或者在我不好意思说的任何情况下。谢谢你的帮助!


最后一个参数为for_each模板是一个functor. Functor是可以使用“调用”的东西()运算符(可能带有参数)。根据定义,有两种不同类型的函子:

  1. 普通的非成员函数是 函子。
  2. 具有重载的类类型的对象()运算符(所谓的函数对象) 也是函子。

现在,如果您想使用普通函数作为函子for_each,它看起来像下面这样

inline void do_something(int &i) { /* do something */ }

int main() {
  int array[10];
  std::for_each(array, array + 10, &do_something);
}

在这种情况下for_each模板使用[推导]参数实例化<int *, void (*)(int &)>。请注意,本例中的实际函子值是函数指针&do_something作为函数参数传递。从以下角度来看for_each函数这是一个运行时值。由于它是一个运行时值,因此无法内联对函子的调用。 (就像一般情况下不可能内联通过函数指针进行的任何调用一样)。

但如果我们使用函数对象,代码可能如下所示

struct do_something {
  void operator()(int &i) { /* do something */ }
}; 

int main() {
  int array[10];
  std::for_each(array, array + 10, do_something());
}

在这种情况下for_each模板使用[推导]参数实例化<int *, do_something>。从内部调用函子for_each将被引导至do_something::operator()。调用的目标是已知的并在编译时固定。由于目标函数在编译时已知,因此可以轻松内联调用。

当然,在后一种情况下,我们还有一个运行时值作为参数传递给for_each。它是一个[可能是“虚拟”临时]实例do_something我们调用时创建的类for_each。但这个运行时值对调用的目标没有影响(除非operator ()是虚拟的),所以它不影响内联。

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

在 C++ 中,编译器“内联”函数对象意味着什么? 的相关文章

随机推荐

  • 无需root即可在linux下编译boost [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我如何在linux下编译boost而不写入系统文件夹 我需要在我的特定文件夹中获取 boost 的头文件和共享库 您无需成为 root 即
  • Amazon S3 在跨账户中文件“访问被拒绝”异常

    我有 2 个 AWS 账户 帐户 A 有 S3 存储桶 BUCKET 我使用 Java api 将文件放入其中 我已将 BUCKET 策略配置为允许跨帐户文件发布 但是 当我尝试从帐户 A 打开此文件时 它说AccessDenied使用 h
  • HPET 可以在 Windows 中直接访问吗?

    我想使用高性能事件计时器 HPET 作为分析工具来快速进行非常高精度的测量 timeGetTime 在 1 毫秒时无法提供足够的分辨率 并且 QueryPerformanceCounter 每次读取的速度比我想要的要慢得多 我在研究这个问题
  • librosa 无法打开由 librosa 创建的 .wav?

    我正在尝试使用 librosa 通过从一些持续时间为 60 秒的 wav 文件中剪切 1 秒的片段来生成一些数据 这部分有效 我创建了所有文件 我也可以通过任何播放器收听它们 但是如果我尝试使用 librosa load 打开它们 我会收到
  • HBase更新操作

    我是HBase新手 我发现HBase客户端API不支持更新操作 那是对的吗 如果是这样 更新特定行键的值的建议最佳实践是什么 您可以使用 PUT 来创建或更新任何单元格的值 你don t需要使用删除 除非您希望新版本不包含某些旧单元格 说我
  • SQLite 查询异常 Android Studio 语法错误代码 1

    所以我试图为我的 Android 应用程序构建一个搜索方法 但我一直遇到这个错误 android database sqlite SQLiteException near Prefect syntax error code 1 while
  • 解析YAML,返回行号

    我正在根据 YAML 数据制作一个文档生成器 它将指定每个项目是从 YAML 文件的哪一行生成的 做这个的最好方式是什么 所以如果 YAML 文件是这样的 key1 item 1 key2 item 2 key1 another item
  • 配置文件不包括签名证书

    我已将 Xcode 更新到 8 因为我无法运行我的项目 我尝试启用 禁用 自动管理签名 选项 但不断收到 2 个警报 您的应用程序 ID 无法注册到您的开发团队 配置文件 不包括签名证书 我的签名证书 我是我们开发人员门户上的团队代理 我可
  • 如何在 Angular 中将标签与其外部的表单字段关联起来?

    假设我正在 ngFor 循环中创建标签和表单字段 如下所示 应用程序组件 ts export class AppComponent items aaa bbbbbb ccccccccc 应用程序组件 html div class form
  • Xcode 看不到我的 iOS 设备,但 iTunes 可以

    我有一个奇怪的问题 我的 Mac 上安装了装有 iOS 5 0 1 9A405 的 iPad 和 iOS SDK 5 0 1 以及 Xcode 4 2 Build 4C199 Xcode 看不到我的设备 它像往常一样说 iOS设备 而不是
  • Kafka Streams.allMetadata() 方法返回空列表

    所以我正在尝试使用 Kafka 流进行交互式查询 我有 Zookeeper 和 Kafka 在本地运行 在 Windows 上 我使用 C temp 作为 Zookeeper 和 Kafka 的存储文件夹 我已经设置了这样的主题 kafka
  • 在 Flutter 中更新下拉数据出现错误

    我正在开发一个小部件 其中包含dropdownbutton在颤振中 该小部件创建dropdownmenuitems向用户传入的 url 发出请求后 我已经看到正在拨打的电话和有效的响应 但是当我使用setState要更新下拉列表的数据源 我
  • 你能从 lua 修改 C 结构体吗?

    我希望能够拥有这个 Lua 代码 function myfunc s print s value s value 7 end 它应该适用于以下 C 代码 struct MyStruct float value void func MyStr
  • Func 委托中的 out 参数修饰符 (C#)

    我是 C 的初学者 只是一个关于 Func delegate 的问题 public delegate TResult Func
  • angularjs:在 ui-bootstrap 模式中使用指令

    我不知道如何从使用 dialog 服务创建的模式中调用指令 该指令还应该能够看到模式上的按钮并覆盖它们的 ng click 操作 这是我的模态模板 div class modal header h1 Rechercher h1 div di
  • 如何为Apple Watch添加加载视图?

    我想在按下 WKInterfaceButton 后显示加载视图 苹果提供的视图 我需要这个 因为按下 WKInterface 按钮后 我将调用主 iPhone 应用程序来执行一些服务调用 这将需要一些时间才能返回响应 WKInterface
  • 从 Visual Studio 2012 签入 TFS 后,所有文件都标记为只读

    我有两个项目的解决方案 我刚刚标记了解决方案并签入了它 现在所有文件的左侧都有蓝色挂锁的小图像 这显然意味着它们被标记为只读 到目前为止 我一直只使用 Tortoise SVN 这是我第一次签入 TFS 那么为什么会发生这种情况 或者如果这
  • 防止TinyMCE删除span元素

    这是问题演示 你可以在这里尝试一下 http fiddle tinymce com SLcaab http fiddle tinymce com SLcaab 这是TinyMCE默认配置 减去所有插件 使用扩展有效元素 跨度 1 打开 Ht
  • 如何在 Linux 和 Solaris 上编译 C?

    我想制作一个可以在 Linux 和 Solaris 中编译的 Makefile 我知道如何单独执行此操作 但如何将两者结合起来并能够检测我正在使用哪种操作系统 我试图仅对一个简单的 C 文件执行此操作 但更改的是编译器的名称 GNU Aut
  • 在 C++ 中,编译器“内联”函数对象意味着什么?

    在维基百科中它表示此类对象与 for each 一起使用时具有性能优势 因为编译器可以 内联 它们 我对这在这种情况下的确切含义有点模糊 或者在我不好意思说的任何情况下 谢谢你的帮助 最后一个参数为for each模板是一个functor