"RawPointer" (编译类型)
"RawPointer" (编译类型)
"RawPointer"::[t]
代表一个指向类型为 t 的对象的指针,适合与外部库一起使用.
函数构造
- ToRawPointer 可用于创建一个指针对象,该对象使用分配在栈上的内存,并且在封闭函数返回之前是有效的.
- 除非使用 "Managed" 包装,否则使用 CreateTypeInstance 构造的指针对象不会自动进行内存管理,必须通过 DeleteObject 手动释放.
- CreateTypeInstance["RawPointer"::[type]] 构造一个原始指针.
- CreateTypeInstance["Managed"::["RawPointer"::[type]]] 构造一个内存托管的 C 原始指针.
属性
- 类型 "RawPointer"::[t] 的 ptr 的 Information[ptr,"BaseType"] 给出 "TypeSpecifier"::[t].
- FromRawPointer[ptr] 返回 ptr 所指向的值.
转换
- RawPointer 表达式可以在已编译代码中被转换为原始指针类型.
- 已编译的 "RawPointer" 元素可以被转换为 RawPointer 表达式. 注意,在已编译代码中,原始指针必须通过 CreateTypeInstance 动态分配.
- Cast 可用于在 C 语言数组和指针之间进行相互 bitcast 转换.
- Cast 可用于在指针和不透明的指针之间进行相互 bitcast 转换.
来自表达式
变成表达式
"CArray"
"OpaqueRawPointer"
运行时错误
- 用 FromRawPointer 对指针解引用 (dereferencing) 是一个不安全的操作. 试图对无效指针解引用会导致崩溃.
范例
基本范例 (4)
创建 "RawPointer"::["MachineInteger"],然后对其进行解引用:
cf = FunctionCompile[Function[Typed[arg, "Integer64"],
With[{p = ToRawPointer[arg]}, FromRawPointer[p]]
]]cf[4]funcDec = LibraryFunctionDeclaration["addonePointer", "compilerDemoBase", {"CInt", "RawPointer"::["CInt"]} -> "CInt"];cf = FunctionCompile[funcDec,
Function[Typed[n, "CInt"], Module[{ptr},
ptr = Typed[ToRawPointer[], "RawPointer"::["CInt"]];
LibraryFunction["addonePointer"][n, ptr];
FromRawPointer[ptr]
]]]cf[12]cf = FunctionCompile[
Function[Typed[n, "Integer64"], Module[{ptr},
ptr = CreateTypeInstance["RawPointer"];
ToRawPointer[ptr, n];
ptr
]]]rp = cf[12]cf1 = FunctionCompile[
Function[Typed[rp, "RawPointer"::["Integer64"]], Module[{val}, val = FromRawPointer[rp];DeleteObject[rp];val]
]]cf1[rp]cf = FunctionCompile[
Function[Typed[n, "Integer64"], Module[{ptr},
ptr = CreateTypeInstance["Managed"::["RawPointer"::["Integer64"]]];
ToRawPointer[ptr, n];
ptr
]]]rp = cf[12]cf1 = FunctionCompile[
Function[Typed[rp, "Managed"::["RawPointer"::["Integer64"]]], FromRawPointer[rp]
]]指针不应被手动释放,因为这将由 "Managed" 自动完成:
cf1[rp]技术笔记
历史
2022年引入 (13.1)