我来自C / C ++背景,我想知道是否" new"以与那些语言类似的方式工作。例如,对于C ++中的性能提升,可以预先分配大量内存并使用此内存。
答案 0 :(得分:5)
这些语言之间的内存分配差别很大;这是一个很大的主题,它不能简化为一个简单的问题,比如java中的new
是否有效"以类似的方式"就像在C ++中一样。
为了给你一个简单的答案,它确实不以类似的方式工作,因为在Java中你永远不需要delete
。
为了让你更开心,我还要补充一点,Java中的new
声称要比C ++快得多,因为运行时不需要维护已分配和空闲块的链接列表,而且不必搜索足够大的间隙来包含您需要的块。此外,它不会遇到C ++可能遇到的内存碎片问题。
大多数情况下,(如果你在充足的内存条件下运行,而且在现代我们通常都是这样),java运行时只是有一个指针指向分配的内存和空闲内存之间的边界,它需要一个该指针的副本,它将您想要的字节数添加到指针,并将副本返回给您。垃圾收集期间,后期开销很晚。
因此,总体而言,java往往比C ++更快地为您提供内存,但由于频繁和复杂的垃圾收集,它会在整个运行时分散一些开销。这种开销是不可避免的,有些不可预测,但在现代机器上,它主要(但并不总是)难以察觉。
最重要的是,从一开始,Java旨在让程序员免于担心内存分配,并且在很大程度上它已经非常成功地做到了这一点。只有极其罕见,非常特殊的情况下,java程序员才需要担心预分配对象,实现自己的对象池等等。所有这些都是java中的非问题。