C ++模板:是否内联了模板实例?性能上有缺点吗?

统一

当某些C ++实体(例如结构,类或函数)被声明为模板时,为所述实体提供的定义仅仅是必须实例化的蓝图。

由于必须在声明模板实体时定义模板实体(通常是头文件),所以我有一个想法,我试图说服自己是错误的,当实例化模板后,它将被内联。编译器。我想问这样吗?

当我阅读以下段落时,这个问题的答案引起了我的怀疑:

“模板可能导致编译时间变慢,并且可能导致更大的可执行文件,尤其是对于较旧的编译器。”

较慢的编译时间很明显,因为必须实例化模板,但是为什么“可能更大的可执行文件”呢?应该用什么方式解释?我应该将其解释为“内联许多函数”还是“如果存在许多模板实例化,则可执行文件的大小会增加,也就是说,同一模板具有许多不同类型的实例化,这会导致存在同一实体的多个副本” ?

在后一种情况下,较大的可执行文件大小是否会导致软件运行速度降低,并看到必须将更多代码加载到内存中,从而导致昂贵的分页?

另外,由于这些问题在某种程度上也取决于编译器,因此我对Visual C ++编译器感兴趣。关于大多数编译器的功能的通用答案也提供了很好的见解。

先感谢您。

理查德·霍奇斯

由于必须在声明模板实体时定义模板实体(通常是头文件)

不对。您可以分别声明和定义模板类,方法和函数,就像其他类,方法和函数一样。

我有一个想法,我试图说服自己是错误的,当实例化一个模板后,它将被编译器内联。我想问这样吗?

其中某些可能是全部或全部,也可能全无。编译器将尽其所能。

较慢的编译时间很明显,因为必须实例化模板,但是为什么“可能更大的可执行文件”呢?应该用什么方式解释?

可以用多种方式来解释它。以一瓶Asprin包含警告“可能在<此处插入副作用>”的相同方式。

我应该将其解释为“内联许多函数”还是“如果存在许多模板实例化,则可执行文件的大小会增加,即同一模板具有许多不同类型的实例化,从而导致存在同一实体的多个副本” ?

您不会有同一实体的多个副本-编译器套件必须做到这一点。即使方法是内联的,该方法的地址也将:

  1. 一直存在,并且
  2. 被多个编译单元引用时,该地址应为同一地址。

您可能会发现,开始创建的类型比预期的要多。例如std::vector<int>与完全不同的类型std::vector<double>foo<X>()与的功能不同foo<Y>()程序中类型和函数定义的数量可以快速增长。

在后一种情况下,较大的可执行文件大小是否会导致软件运行速度降低,并看到必须将更多代码加载到内存中,从而导致昂贵的分页?

分页过多,可能不是。高速缓存未命中的可能性很大。通常,针对较小的代码进行优化是一种实现良好性能的好策略(在某些情况下,例如,当访问的数据很少且全部在缓存中时)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++模板模板实例化

来自分类Dev

获取模板实例C ++ 11的模板

来自分类Dev

所有模板实例的C ++单函数指针

来自分类Dev

具有复杂类型的C ++模板实例化

来自分类Dev

所有模板实例的C ++单函数指针

来自分类Dev

在C ++模板继承中强制执行完整模板实例化吗?

来自分类Dev

相互引用的C ++模板实例化

来自分类Dev

模板实例变量的C ++检查类型

来自分类Dev

努力理解C ++模板实例化

来自分类Dev

可以实例化c ++类模板,但是具有相同模板参数的功能模板实例化失败

来自分类Dev

链接程序通常会优化不同c ++模板实例中的重复代码吗?

来自分类Dev

链接程序通常会优化不同c ++模板实例中的重复代码吗?

来自分类Dev

在这种情况下,c ++标准是否保证模板实例化?

来自分类Dev

是否可以在C ++中使用非默认构造函数创建模板实例?

来自分类Dev

c ++概念是否导致模板实例化被编写以生成输出?

来自分类Dev

在C ++中的模板实例化中将带有构造函数的类用作类型参数

来自分类Dev

跨DLL的C ++成员函数显式模板实例化

来自分类Dev

部分模板实例化中的C ++ Typedef

来自分类Dev

在库中强制为C ++模板实例定义符号

来自分类Dev

C ++中类成员的模板实例化

来自分类Dev

在C ++模板实例化中查找从属名称

来自分类Dev

C ++模板实例化,错误:非类类型'int'的成员

来自分类Dev

使用clang的显式C ++模板实例化

来自分类Dev

为什么C ++模板实例化失败?

来自分类Dev

跨DLL的C ++成员函数显式模板实例化

来自分类Dev

C ++模板类型的圆度和指向模板实例的非模板指针

来自分类Dev

组合不同的Javascript框架是否有缺点?

来自分类Dev

C ++,使用模板实例化存储对象实例的通用节点

来自分类Dev

在C ++中如何将运行时类型标识符映射到模板实例(无需手动枚举所有实例)?

Related 相关文章

  1. 1

    C ++模板模板实例化

  2. 2

    获取模板实例C ++ 11的模板

  3. 3

    所有模板实例的C ++单函数指针

  4. 4

    具有复杂类型的C ++模板实例化

  5. 5

    所有模板实例的C ++单函数指针

  6. 6

    在C ++模板继承中强制执行完整模板实例化吗?

  7. 7

    相互引用的C ++模板实例化

  8. 8

    模板实例变量的C ++检查类型

  9. 9

    努力理解C ++模板实例化

  10. 10

    可以实例化c ++类模板,但是具有相同模板参数的功能模板实例化失败

  11. 11

    链接程序通常会优化不同c ++模板实例中的重复代码吗?

  12. 12

    链接程序通常会优化不同c ++模板实例中的重复代码吗?

  13. 13

    在这种情况下,c ++标准是否保证模板实例化?

  14. 14

    是否可以在C ++中使用非默认构造函数创建模板实例?

  15. 15

    c ++概念是否导致模板实例化被编写以生成输出?

  16. 16

    在C ++中的模板实例化中将带有构造函数的类用作类型参数

  17. 17

    跨DLL的C ++成员函数显式模板实例化

  18. 18

    部分模板实例化中的C ++ Typedef

  19. 19

    在库中强制为C ++模板实例定义符号

  20. 20

    C ++中类成员的模板实例化

  21. 21

    在C ++模板实例化中查找从属名称

  22. 22

    C ++模板实例化,错误:非类类型'int'的成员

  23. 23

    使用clang的显式C ++模板实例化

  24. 24

    为什么C ++模板实例化失败?

  25. 25

    跨DLL的C ++成员函数显式模板实例化

  26. 26

    C ++模板类型的圆度和指向模板实例的非模板指针

  27. 27

    组合不同的Javascript框架是否有缺点?

  28. 28

    C ++,使用模板实例化存储对象实例的通用节点

  29. 29

    在C ++中如何将运行时类型标识符映射到模板实例(无需手动枚举所有实例)?

热门标签

归档