【问题标题】:Should templated classes be precisely as fast as untemplated classes?模板化的类应该和非模板化的类一样快吗?
【发布时间】:2021-02-14 04:52:08
【问题描述】:

我有一个仅存在于集合中的非通用对象。我正在编写的一个定义对象的库,我们称之为Collected,以及集合的两个实现,它们在不同的场景中应该有优势。我们称他们为Collection1Collection2。集合是此应用程序中高速处理的核心,因此可以说性能是最重要的。

Collected 的代码在两者之间是相同的,除了 1) 接受其集合的 ctor 参数,以及 2) 存储它的成员变量。

所以,我很想用TemplatedCollected<class T> 替换Collected,并进行明显的代码更改。 使用该库的应用程序可以集中决定他们想要哪个,并将MyCollected 定义为TemplatedCollected<Collection1>TemplatedCollected<Collection2>

但是,如果有任何可能更快,我可以创建一个相同的 Collected1Collected2 类,除了它们支持的集合。 (同样,该应用可以根据他们的需要定义MyCollected。)

【问题讨论】:

  • 一切都一样,是的,速度一样快。在您描述的情况下,模板本质上只是重复代码的简写,它的运行时开销应该为零。
  • 能否在您的问题中包含一些基本的示例代码?通常我们不会无缘无故地对事物进行模板化......但您似乎有三种情况:普通收集、模板收集和收集1+收集2。如果第一个选项(单个非模板类)可用,为什么还要考虑其他选项?
  • 虽然可以进行一些概括,但最佳设计通常针对特定类。为什么要使用不同的集合?转换集合有意义吗?拥有基类和派生类并使用虚函数是否有意义?如果该类有 3 行,则可能不会使用与它有几千行相同的方法。此外,如果集合有 5 个项目,那么如果它有 500000 个项目,人们可能会做出不同的决定。

标签: c++ performance c++11 templates


【解决方案1】:

模板类唯一的开销是因为它们生成了一个新类。这需要编译时间编译内存,并可能导致生成更多程序代码。最后,模板的符号长度有时可能比您手写的要长。

然而,最后一点只是因为使用模板生成程序代码比手写更容易。如果您在模板上复制粘贴模板实现两次也不会更糟。

最大的代价是从头部拆分模板实现有点让人头疼。

但是,您正在处理性能问题。如果性能很重要,您应该进行分析。您不应该排除使用模板的可能性——将优化放在一个地方并将其应用于两者的能力具有很高的价值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 2017-07-18
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多