当某些C ++实体(例如结构,类或函数)被声明为模板时,为所述实体提供的定义仅仅是必须实例化的蓝图。
由于必须在声明模板实体时定义模板实体(通常是头文件),所以我有一个想法,我试图说服自己是错误的,当实例化模板后,它将被内联。编译器。我想问这样吗?
当我阅读以下段落时,这个问题的答案引起了我的怀疑:
“模板可能导致编译时间变慢,并且可能导致更大的可执行文件,尤其是对于较旧的编译器。”
较慢的编译时间很明显,因为必须实例化模板,但是为什么“可能更大的可执行文件”呢?应该用什么方式解释?我应该将其解释为“内联许多函数”还是“如果存在许多模板实例化,则可执行文件的大小会增加,也就是说,同一模板具有许多不同类型的实例化,这会导致存在同一实体的多个副本” ?
在后一种情况下,较大的可执行文件大小是否会导致软件运行速度降低,并看到必须将更多代码加载到内存中,从而导致昂贵的分页?
另外,由于这些问题在某种程度上也取决于编译器,因此我对Visual C ++编译器感兴趣。关于大多数编译器的功能的通用答案也提供了很好的见解。
先感谢您。
由于必须在声明模板实体时定义模板实体(通常是头文件)
不对。您可以分别声明和定义模板类,方法和函数,就像其他类,方法和函数一样。
我有一个想法,我试图说服自己是错误的,当实例化一个模板后,它将被编译器内联。我想问这样吗?
其中某些可能是全部或全部,也可能全无。编译器将尽其所能。
较慢的编译时间很明显,因为必须实例化模板,但是为什么“可能更大的可执行文件”呢?应该用什么方式解释?
可以用多种方式来解释它。以一瓶Asprin包含警告“可能在<此处插入副作用>”的相同方式。
我应该将其解释为“内联许多函数”还是“如果存在许多模板实例化,则可执行文件的大小会增加,即同一模板具有许多不同类型的实例化,从而导致存在同一实体的多个副本” ?
您不会有同一实体的多个副本-编译器套件必须做到这一点。即使方法是内联的,该方法的地址也将:
您可能会发现,开始创建的类型比预期的要多。例如std::vector<int>
与完全不同的类型std::vector<double>
。foo<X>()
与的功能不同foo<Y>()
。程序中类型和函数定义的数量可以快速增长。
在后一种情况下,较大的可执行文件大小是否会导致软件运行速度降低,并看到必须将更多代码加载到内存中,从而导致昂贵的分页?
分页过多,可能不是。高速缓存未命中的可能性很大。通常,针对较小的代码进行优化是一种实现良好性能的好策略(在某些情况下,例如,当访问的数据很少且全部在缓存中时)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句