何时应该使用Ptr而不是Ref.

  • 本文关键字:Ref Ptr 何时应 julia
  • 更新时间 :
  • 英文 :


根据文档Ptr{T}

A memory address referring to data of type T. However, there is no guarantee that the memory is actually valid, or
that it actually represents data of the specified type.

来自另一方面:

Ref{T}
An object that safely references data of type T. This type is guaranteed to point to valid, Julia-allocated memory
of the correct type. The underlying data is protected from freeing by the garbage collector as long as the Ref
itself is referenced.

所以我的问题是:Ref似乎比Ptr有相同的用例,在任何情况下似乎都比Ptr好。什么时候我们应该使用Ptr{T}而不是Ref{T}?

当您将C混合到Julia中时,它很有用(这并不奇怪,因为您引用的文档页面名为"C接口")。就像你说的,一个Ref看起来像一个加强了的Ptr,保证有有效的Julia分配的内存,由Julia的垃圾收集器处理。Ptr更适合包装在C端创建和处理的指针。指南写在一个小章节"何时使用T, Ptr{T}和Ref{T}"中;《调用C和Fortran代码》页面:

在Julia代码包装调用外部C例程时,普通(非指针)数据应该在调用中声明为T类型,因为它们是按值传递的。对于接受指针的C代码,Ref{T}通常应该用于输入参数的类型,允许Julia或C通过隐式调用Base.cconvert来使用指向内存的指针。相反,被调用的C函数返回的指针应该声明为输出类型Ptr{T},这反映了所指向的内存仅由C管理。C结构体中包含的指针应该在相应的Julia结构体类型中表示为Ptr{T}类型的字段,以模仿相应的C结构体的内部结构。

如果您使用的是纯Julia,您将希望坚持使用Ref,尽管您不需要经常使用它,因为引用通常出现在具有抽象类型的可变对象或结构字段中。Ref在将不可变对象广播和包装在可变引用中,将可迭代对象变为标量时非常有用。

最新更新