【发布时间】:2021-02-14 04:52:08
【问题描述】:
我有一个仅存在于集合中的非通用对象。我正在编写的一个定义对象的库,我们称之为Collected,以及集合的两个实现,它们在不同的场景中应该有优势。我们称他们为Collection1 和Collection2。集合是此应用程序中高速处理的核心,因此可以说性能是最重要的。
Collected 的代码在两者之间是相同的,除了 1) 接受其集合的 ctor 参数,以及 2) 存储它的成员变量。
所以,我很想用TemplatedCollected<class T> 替换Collected,并进行明显的代码更改。
使用该库的应用程序可以集中决定他们想要哪个,并将MyCollected 定义为TemplatedCollected<Collection1> 或TemplatedCollected<Collection2>。
但是,如果有任何可能更快,我可以创建一个相同的 Collected1 和 Collected2 类,除了它们支持的集合。 (同样,该应用可以根据他们的需要定义MyCollected。)
【问题讨论】:
-
一切都一样,是的,速度一样快。在您描述的情况下,模板本质上只是重复代码的简写,它的运行时开销应该为零。
-
能否在您的问题中包含一些基本的示例代码?通常我们不会无缘无故地对事物进行模板化......但您似乎有三种情况:普通收集、模板收集和收集1+收集2。如果第一个选项(单个非模板类)可用,为什么还要考虑其他选项?
-
虽然可以进行一些概括,但最佳设计通常针对特定类。为什么要使用不同的集合?转换集合有意义吗?拥有基类和派生类并使用虚函数是否有意义?如果该类有 3 行,则可能不会使用与它有几千行相同的方法。此外,如果集合有 5 个项目,那么如果它有 500000 个项目,人们可能会做出不同的决定。
标签: c++ performance c++11 templates