C++ 模板的性能? [关闭]

2024-01-05

我在网上看到过几次有人提到 C++ 使用模板可以变得更快。

有人可以解释一下,包括在低层次上解释一下为什么会这样吗?我总是认为这样一个“好的”功能会像大多数有用的概念一样产生开销。

从超低延迟的角度来看,我对此非常感兴趣!


一个常见的例子是排序。

In C, qsort接受一个指向比较函数的指针。一般来说,都会有一份qsort代码,未内联。它将通过指向比较例程的指针进行调用——当然这也不是内联的。

In C++, std::sort是一个模板,它可以将函子对象作为比较器。有一个不同的副本std::sort对于用作比较器的每种不同类型。假设您使用重载的函子类operator(),然后调用比较器can很容易被内联到这个副本中std::sort.

因此,模板为您提供了更多内联,因为有更多的副本sort代码,每个代码都可以内联不同的比较器。内联是一个相当好的优化,并且排序例程会进行大量比较,因此您可以经常测量std::sort比同类跑得更快qsort。这样做的代价是可能会出现更大的代码——如果您的程序使用许多不同的比较器,那么您将获得排序例程的许多不同副本,每个副本都包含不同的比较器。

原则上,C 实现没有理由不能内联qsort进入它被称为的地方。然后,如果使用函数名称调用它,理论上优化器可以观察到在使用它时,函数指针must仍然指向相同的功能。然后它可以内联对该函数的调用,结果将类似于std::sort。但在实践中,编译器往往不会迈出第一步,内联qsort。这是因为(a)它很大,并且(b)它位于不同的翻译单元中,通常编译到您的程序链接的某个库中,并且(c)要这样做,您将有一个内联副本qsort对于每次调用它,而不仅仅是每个不同比较器的副本。因此它会比 C++ 更加臃肿,除非实现也能找到一种方法来在以下情况下通用代码:qsort在不同的地方用相同的比较器调用。

因此,通用函数如qsort由于通过函数指针或其他间接调用[*],C 中往往会产生一些开销。 C++ 中的模板是保持源代码通用但确保其编译为专用函数(或多个此类函数)的常用方法。专用代码有望更快。

值得注意的是,模板绝不只是与性能有关。std::sort本身比qsort在某些方面。例如qsort只对数组进行排序,而std::sort可以对提供随机访问迭代器的任何内容进行排序。例如,它可以对deque,其内部是几个单独分配的不相交数组。因此,使用模板并不一定会带来任何性能优势,可能是出于其他原因。碰巧模板确实会影响性能。

[*] 另一个排序示例 -qsort接受一个整数参数,表示数组的每个元素有多大,因此当它移动元素时,必须调用memcpy或与此变量的值类似。std::sort在编译时知道元素的确切类型,从而知道确切的大小。它可以内联一个复制构造函数调用,该调用反过来可能会转换为复制该字节数的指令。与内联比较器一样,通常可以比调用复制可变字节数的例程(向其传递值 4(或 8)来更快地复制 4(或 8、或 16 或其他)字节)。 ,或 16,或其他)。和以前一样,如果你打电话qsort具有大小的字面值,并且调用qsort被内联,那么编译器可以在 C 中执行完全相同的优化。但实际上您看不到这一点。

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

C++ 模板的性能? [关闭] 的相关文章

随机推荐

  • CMake 项目找不到共享库

    我正在使用 CMake 构建跨平台项目 目前我正在尝试在 Linux 上运行它 我最近添加了一个用于运行测试的项目 但它不会运行 因为它找不到共享库之一 特别是libtbbmalloc so 2 tests error while load
  • 静态析构函数

    假设我有 void foo static Bar bar c 是否保证 Bar Bar 在 bar 上被调用 并且 Bar Bar 永远不会在 bar 上调用 直到 main 退出之后 Thanks 是的 第一次foo 叫做 Bar bar
  • 您如何向非程序员解释演员? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 好吧 标题差不多就是这样 如果我让一个非技术人员 我的妈妈 12 岁的男孩 可卡犬坐在你面前并要求你解释actors http en
  • Pandas - groupby ValueError:无法使用包含多个元素的元组对列进行子集化。使用列表代替

    我将我的 Pandas 从我认为是 1 5 1 更新到了 2 0 1 无论如何 我开始在一些以前运行良好的代码上出现错误 df df groupby df date dt date Lake Canyon mean reset index
  • 警告 C26454:算术溢出:“-”运算在编译时产生负的无符号结果 (io.5)

    代码分析 ON NOTIFY TCN SELCHANGE IDC TAB HISTORY TYPE CAssignHistoryDlg OnTcnSelchangeTabHistoryType 警告 C26454 算术溢出 运算产生负的无符
  • 使用 EF Core 在 Azure Functions 上的 Application Insights 中启用 Sql 依赖关系

    我有一个 Azure Function v3 应用程序 它使用Microsoft EntityFrameworkCore 3 1 5 我无法启用 SQL 依赖项跟踪 已经挣扎了1天了 为了隔离问题 我创建了一个不带 EF 的独立 Azure
  • 如何在Sphinx Alabaster主题下编辑侧边栏

    我有以下内容index rst file Know the cell population of your data Some content toctree maxdepth 2 Installation toctree maxdepth
  • 阻止 Chrome 缓存网站的 DNS 记录

    Chrome 会缓存 DNS 记录 并且在成功连接到我的网站 除非重新启动 后往往会忽略对主机文件的更改 启用 DNS 预取后 这种情况更加明显 是否有任何页面标头指示 Chrome 不缓存网站的 DNS 喜欢Cache Control或类
  • 您可以安装不需要 Visual Studio 的独立 TFS 客户端吗?

    是否可以在未安装 Visual Studio 的服务器上获得独立的 TFS 客户端 我们想要一种从服务器 访问 TFS 项目的方法 而无需安装 Visual Studio 可能的 我见过 Team Explorer 但是如果没有 Visua
  • 获取连接网络的 WiFi 信号强度

    我正在尝试在 Android 应用程序中显示已连接 WiFi 网络的信号强度 我尝试过以下方法 Receiver for information on the network info private BroadcastReceiver m
  • CakePHP:向表单添加字段(动态)

    我正在尝试动态地将字段添加到我的 CakePHP 表单中 但似乎我使用的每种方法都有其自己无法修复的缺点 这是我尝试过的 不要添加新的输入 只需用逗号分隔单个输入中的值即可 这看起来很简单 但在尝试分解输入并将每个值保存在数据库中的新行中时
  • 为 C# 生成 XML 文档的 XSD? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道某处是否有 XSD 文件可用于验证使用 doc 选项编译 C 项目时生成的 XML 文档 我想
  • 如何为依赖动态数据的函数编写单元测试?

    假设您有一个网站 它使用一个函数从数据库检索数据并返回要显示 解析 等的结果 由于从数据库检索的数据是动态的 并且可能每天都在变化 因此如何正确地为此函数编写单元测试 假设该函数应该返回一个结果数组 显然 单元测试可以测试是否返回数组 但是
  • 如何设置 Windows 符号服务器

    我在网络上有一个备用服务器 我想用它来托管我们所有的构建符号 我已经知道如何在本地开发系统上设置符号缓存并将调试器 例如 Windbg 指向 符号文件路径 中的该路径 我认为我可以对网络上具有自己的符号缓存 例如 host symbols
  • 错误:Firestore 已初始化。您只能调用 settings() 一次,并且只能在调用 Firestore 对象上的任何其他方法之前

    因此 我正在为 firebase 规则编写测试 以便我可以为我在 stackoverflow 上编写的另一个问题创建可重现的代码 但我收到此错误 mocha test2 js Our social app 1 Can read a sing
  • VBA从Word表格复制到Excel

    我正在尝试从 Word 文件中的特定表单元格生成一个包含 5 列的 Excel 文件 从 Word 表复制到 Excel 我的Word文件有280个表格 我对要从 Word 文件复制的单元格进行寻址没有问题 但我不知道为什么结果是一个空白的
  • 通过 iPhone Web 应用程序访问相机

    据我了解 不太可能通过 HTML 访问网络摄像头 那么在 iPhone 上呢 是否可以 从 iOS6 开始 您可以使用以下命令访问相机和照片
  • 如何为Python 3子进程分配CPU亲和力?

    我在 Python 方面还是个新手 我在 Windows 7 和 Windows 10 上运行 Tkinter GUI 我有一个子进程以 1 KHz 运行数据记录器例程 我想为子进程设置 cpu 亲和力 我正在使用 Python 3 8 进
  • 使用 Media * API 进行录制时,支持的媒体类型的完整列表在哪里?

    我正在尝试学习如何在浏览器中记录媒体 我可能会让事情变得过于复杂 有大量直接的例子 但当录音被推到一个高度时 我陷入了困境 Blob具有任意选择的媒体类型的对象 而不检查该格式是否受支持 因此 我认为有一个清单 或者人们只是继续以过去的经验
  • C++ 模板的性能? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi