好的,Java 泛型和C++ 模板是如此不同,我不确定是否可以在一个问题中回答它们.
这些都是语法糖.它们是通过一种名为类型擦除的有争议的决定来实现的.他们真正做的就是阻止你不得不投入很多东西,这使得它们更安全.性能与制作专用类相同,除非您使用的是原始数据类型(int,float,double,char,bool,short).在这些情况下,值类型必须装箱到相应的引用类型(Integer,Float,Double,Char,Bool,Short),这有一些开销.内存使用情况相同,因为JRE只是在后台执行转换(基本上是免费的).
Java也有一些很好的类型协方差和逆变,这使得事情看起来比不使用它们更清晰.
这些实际上根据输入类型生成不同的类.An std::vector<int>是一个完全不同的类std::vector<float>.不支持协方差或逆变,但支持将非类型传递给模板,部分模板专业化.他们基本上允许你做任何你想做的事.
但是,由于C++模板为其模板参数的每个变体创建不同的类,因此编译的可执行文件的大小更大.除此之外,编译时间也会大大增加,因为每个编译单元都必须包含所有模板代码,并且必须生成更多代码.但是,实际的运行时内存占用量通常小于替代值(释放额外的void*)并且性能更好,因为编译器可以使用已知类型执行更积极的优化.
编辑(感谢DavidRodríguez):虽然通用Java类编译它的全部内容,但在使用C++模板时,只编译您使用的内容.因此,如果您创建std::vector<int>并且仅使用push_back和size,则只将那些函数编译到目标文件中.这减轻了可执行问题的大小.
如果您对它们之间的差异感到好奇,请查看C#,Java和C++中对泛型的比较.
| 归档时间: |
|
| 查看次数: |
2234 次 |
| 最近记录: |