用法:
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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。