使用通用方法?

JGC*_*JGC 5 c++ java generics programming-languages

使用泛型方法(在编译时,运行时,性能和内存中)有什么好处和坏处?

Tra*_*kel 8

好的,Java 泛型和C++ 模板是如此不同,我不确定是否可以在一个问题中回答它们.

Java泛型

这些都是语法糖.它们是通过一种名为类型擦除的有争议的决定来实现的.他们真正做的就是阻止你不得不投入很多东西,这使得它们更安全.性能与制作专用类相同,除非您使用的是原始数据类型(int,float,double,char,bool,short).在这些情况下,值类型必须装箱到相应的引用类型(Integer,Float,Double,Char,Bool,Short),这有一些开销.内存使用情况相同,因为JRE只是在后台执行转换(基本上是免费的).

Java也有一些很好的类型协方差和逆变,这使得事情看起来比不使用它们更清晰.

C++模板

这些实际上根据输入类型生成不同的类.An std::vector<int>是一个完全不同的类std::vector<float>.不支持协方差或逆变,但支持将非类型传递给模板,部分模板专业化.他们基本上允许你做任何你想做的事.

但是,由于C++模板为其模板参数的每个变体创建不同的类,因此编译的可执行文件的大小更大.除此之外,编译时间也会大大增加,因为每个编译单元都必须包含所有模板代码,并且必须生成更多代码.但是,实际的运行时内存占用量通常小于替代值(释放额外的void*)并且性能更好,因为编译器可以使用已知类型执行更积极的优化.

编辑(感谢DavidRodríguez):虽然通用Java类编译它的全部内容,但在使用C++模板时,只编译您使用的内容.因此,如果您创建std::vector<int>并且仅使用push_backsize,则只将那些函数编译到目标文件中.这减轻了可执行问题的大小.


如果您对它们之间的差异感到好奇,请查看C#,Java和C++中对泛型的比较.