用法:
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。