1 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
首先,C 函數(shù)realloc
不是可以增長(zhǎng)數(shù)組的工具,而是以前通過(guò)、或分配malloc
calloc
realloc
的內(nèi)存。相反,C 數(shù)組可能位于堆棧或靜態(tài)內(nèi)存區(qū)域,甚至可能嵌入更大的結(jié)構(gòu)中。
然后,該函數(shù)具有使原始指針無(wú)效free
并返回新指針的語(yǔ)義。所以如果你有指針的副本到處亂飛,你有責(zé)任用新指針替換所有出現(xiàn)的地方。
當(dāng)然,Java 不支持無(wú)效引用。保證每個(gè)非null
對(duì)象引用的有效性,是 Java 內(nèi)存管理的基本屬性。
所以如果你想要 C's 的等價(jià)物realloc
,你必須使用指針而不是數(shù)組。然后sun.misc.Unsafe
有所有相關(guān)操作
public long allocateMemory(long bytes)
public long reallocateMemory(long address, long bytes)
public void freeMemory(long address)
public float getXyz(long address)
1public void putXyz(long address, xyz x)
1
1 其中“xyz”代表原始類型
如果要調(diào)整數(shù)組大小,請(qǐng)使用
array = Arrays.copyOf(array, newSize);
這不會(huì)使舊引用失效,因此如果您無(wú)法替換對(duì)舊數(shù)組的所有引用,使用這些舊引用的代碼將訪問(wèn)舊數(shù)組。
但是,如果array
是對(duì)特定數(shù)組的唯一引用,或者您的代碼確實(shí)替換了所有現(xiàn)有引用,那么理論上JVM可能會(huì)啟用就地調(diào)整大小操作而不是復(fù)制內(nèi)容,另請(qǐng)參見Does Java JIT cheat when running JDK code?
但是檢查必要的先決條件可能比復(fù)制數(shù)組內(nèi)容更昂貴。我可以想象適用性的唯一場(chǎng)景是,如果數(shù)組是同一線程分配的最后一個(gè)對(duì)象,那么可以證明引用還沒(méi)有逃逸,并且在分配空間中數(shù)組后面沒(méi)有對(duì)象。
對(duì)于具有這種優(yōu)化的 JVM,當(dāng)重復(fù)添加到 時(shí),您可能會(huì)自動(dòng)獲得好處ArrayList
,因?yàn)樵擃惔_保它是對(duì)其內(nèi)部數(shù)組的引用的唯一持有者,并且它在Arrays.copyOf
內(nèi)部用于調(diào)整大小。
添加回答
舉報(bào)