因此,C语言有一个realloc()
过程可用于就地增加分配的[edit]内存。
JVM / Java是否存在等效概念?是Array
s还是nio.Buffer
s?我不在乎这是JDK的一部分还是作为外部库,例如sun.unsafe
。
首先,C函数realloc
是不是一个工具,它可以成长阵列,而是记忆先前通过分配malloc
,calloc
或realloc
。相反,C数组可以驻留在堆栈或静态存储区域上,甚至可以嵌入更大的结构中。
然后,该函数具有使原始指针无效的语义,free
并且返回新的指针。因此,如果您有指针的副本在飞来飞去,则有责任用新指针替换所有出现的指针。
当然,Java不支持使引用无效。保证每个非null
对象引用的有效性,是Java内存管理的基本属性。
因此,如果要使用C的等效项realloc
,则必须使用指针而不是数组。然后sun.misc.Unsafe
进行所有相关操作
public long allocateMemory(long bytes)
public long reallocateMemory(long address, long bytes)
public void freeMemory(long address)
public float getXyz(long address)
¹public void putXyz(long address, xyz x)
¹¹其中“ xyz”代表原始类型
如果要调整数组大小,请使用
array = Arrays.copyOf(array, newSize);
这不会使旧引用无效,因此,如果您无法替换所有对旧数组的引用,则使用这些旧引用的代码将访问旧数组。
但是,如果array
唯一的引用是对特定数组的引用,或者您的代码已被证明确实替换了所有现有引用,那么JVM在理论上可以启用就地调整大小操作而不是复制内容,请参见运行JDK代码时Java JIT是否作弊?
但是,检查必要的先决条件可能比复制数组内容更为昂贵。我可以想象一个适用性的唯一情况是,如果数组是同一线程分配的最后一个对象,那么可以证明引用尚未转义,并且分配空间内的数组后面没有对象。
对于具有这种优化的JVM,当您重复将其添加到时,您可能会自动获得好处ArrayList
,因为该类确保它是对其内部数组的唯一引用持有者,并且在Arrays.copyOf
内部用于调整大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句