用法:
GC.@preserve x1 x2 ... xn expr
在表達式 expr 的評估期間,將對象 x1, x2, ... 標記為 in use。僅在 expr implicitly uses 內存或由 x 之一擁有的其他資源的不安全代碼中才需要這樣做。
x 的 Implicit use 涵蓋了編譯器無法看到的對邏輯上由 x 擁有的資源的任何間接使用。一些例子:
- 通過
Ptr直接訪問對象的內存 - 將指向
x的指針傳遞給ccall - 使用將在終結器中清理的
x資源。
@preserve 在短暫延長對象生命周期的典型用例中通常不會對性能產生任何影響。在實現中,@preserve 具有保護動態分配的對象不被垃圾回收等效果。
例子
當從帶有 unsafe_load 的指針加載時,會隱式使用底層對象,例如 x 由以下 unsafe_load(p) 隱式使用:
julia> let
x = Ref{Int}(101)
p = Base.unsafe_convert(Ptr{Int}, x)
GC.@preserve x unsafe_load(p)
end
101
當傳遞指向 ccall 的指針時,指向的對象被隱式使用並且應該被保留。 (但是請注意,您通常應該將 x 直接傳遞給 ccall 這算作顯式使用。)
julia> let
x = "Hello"
p = pointer(x)
Int(GC.@preserve x @ccall strlen(p::Cstring)::Csize_t)
# Preferred alternative
Int(@ccall strlen(x::Cstring)::Csize_t)
end
5相關用法
- Julia GMP.BigInt方法用法及代碼示例
- Julia splice!用法及代碼示例
- Julia @cfunction用法及代碼示例
- Julia LibGit2.count用法及代碼示例
- Julia LinearAlgebra.BLAS.dot用法及代碼示例
- Julia break用法及代碼示例
- Julia sizeof()用法及代碼示例
- Julia :<=用法及代碼示例
- Julia zero()用法及代碼示例
- Julia rem用法及代碼示例
- Julia ...用法及代碼示例
- Julia setfield()用法及代碼示例
- Julia rpad用法及代碼示例
- Julia sort用法及代碼示例
- Julia tail用法及代碼示例
- Julia cis方法用法及代碼示例
- Julia SparseArrays.spdiagm用法及代碼示例
- Julia Distributed.procs方法用法及代碼示例
- Julia Filesystem.mkpath用法及代碼示例
- Julia cld用法及代碼示例
- Julia sqrt方法用法及代碼示例
- Julia LinearAlgebra.bunchkaufman用法及代碼示例
- Julia union!用法及代碼示例
- Julia Iterators.partition用法及代碼示例
- Julia findfirst方法用法及代碼示例
注:本文由純淨天空篩選整理自julialang.org 大神的英文原創作品 Base.GC.@preserve — Macro。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
