当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Julia GC.@preserve用法及代码示例


用法:

GC.@preserve x1 x2 ... xn expr

在表达式 expr 的评估期间,将对象 x1, x2, ... 标记为 in use。仅在 expr implicitly uses 内存或由 x 之一拥有的其他资源的不安全代码中才需要这样做。

xImplicit 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

相关用法


注:本文由纯净天空筛选整理自julialang.org 大神的英文原创作品 Base.GC.@preserve — Macro。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。