c++ - 模板化的类应该和非模板化的类一样快吗?
问题描述
我有一个仅存在于集合中的非通用对象。我正在编写的一个库,它定义了对象,我们称之为它Collected
,以及集合的两个实现,它们在不同的场景中应该有优势。让我们称它们为Collection1
and Collection2
。该集合是此应用程序中高速处理的核心,因此可以说性能是最重要的。
两者之间的代码Collected
是相同的,除了 1) 接受其集合的 ctor 参数,以及 2) 存储它的成员变量。
所以,我很想用明显的代码更改来Collected
代替TemplatedCollected<class T>
。使用该库的应用程序可以集中决定他们想要哪个,并定义MyCollected
为TemplatedCollected<Collection1>
或TemplatedCollected<Collection2>
。
但是,如果有可能更快,我可以创建一个Collected1
和Collected2
类相同的,除了它们支持的集合。(同样,该应用程序可以MyCollected
根据他们的需求进行定义。)
解决方案
模板化类的唯一开销是因为它们生成了一个新类。这需要编译时间和编译内存,并可能导致生成更多程序代码。最后,模板的符号长度有时可能比您手写的要长。
然而,最后一点只是因为使用模板生成程序代码比手写更容易。如果您在模板上复制粘贴模板实现两次也不会更糟。
最大的代价是从头文件中分离模板实现有点让人头疼。
但是,您正在处理性能问题。如果性能很重要,您应该进行分析。您不应该排除使用模板的可能性——将优化放在一个地方并将其应用于两者的能力具有很高的价值。
推荐阅读
- xamarin.ios - 如何在 xamarin iOS 中集成两个应用程序?
- pandas - 垂直连接 2 个数据帧,中间为空行
- python - 使用 PyCharm 在 pytest 中命中断点后,它不显示变量并且无法恢复
- javascript - node.js 有时会出现链接脚本问题
- discord-jda - 检查成员是否具有特定角色
- flask - 如何在 Flask 中的 application/json 的 Content-Type 而不是 text/html 的 Content-Type 中对 API 访问做出所有错误响应?
- database - 使用从数据库中获取的阈值绘制仪表板
- python - 根据一维条件删除 ndarray 中的元素
- python - 类型错误:“列表”对象不可循环调用
- node.js - 使用 GridFSBucket 删除 .files 和 .chunk