當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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