"CArray" (编译类型)
"CArray"::[type]
代表一个与 C 语言兼容的数组类型,包含指定类型的元素.
更多信息
- "CArray" 可用在 Typed 及相关构造中,用来指定类型.
- 类型为 "CArray" 的对象不是由内存自动管理的,必须手动释放.
- "CArray"::[t] 在 C 语言中等价于 t*.
- "CArray" 在与兼容 C 语言的外部库对接时可以使用.
- 类型为 "CArray" 的对象在内部用指针表示.
函数构造
- 除非用 "Managed" 包装,否则用 CreateTypeInstance 构建的 C 数组不会自动进行内存管理,必须用 DeleteObject 手动释放. »
- CreateTypeInstance["CArray"::[type],len] 构建一个长度为 len 的 C 数组.
- CreateTypeInstance["CArray"::[type],carr,len] 构建一个长度为 len 的 C 数组 carr 的副本.
- CreateTypeInstance["CArray"::[type],array] 构建一个包含给定数组元素的 C 数组. 支持的数组类型包括 "ListVector"、"NumericArray" 和 "PackedArray".
- CreateTypeInstance["Managed"::["CArray"::[type]],…] 构建一个内存管理的 C 数组.
属性
- 类型 "CArray"::[type] 的 carr 的 Information[carr,"ElementType"] 给出 type .
- FromRawPointer[carr,offset] 对 C 数组 carr 进行索引. 索引从 0 开始.
转换
- 数组类型的范围可以从 Cast 到受托管 C 数组. 支持的数组类型包括 "ListVector"、"NumericArray" 和 "PackedArray".
- Cast 可用于在 C 语言数组和原始指针之间相互转换.
数组
"RawPointer" 和 "OpaqueRawPointer"
范例
打开所有单元 关闭所有单元基本范例 (3)
cf = FunctionCompile[Function[{}, Module[{carr},
carr = CreateTypeInstance["Managed"::["CArray"::["MachineInteger"]], {3, 1, 4}];
FromRawPointer[carr, 2]
]]]cf[]表示一个来自外部库的函数,它需要一个 C 语言数组作为参数:
dec = LibraryFunctionDeclaration["sumArray", "compilerDemoBase", {"CArray"::["CLong"], "CLong"} -> "CInt"];cf = FunctionCompile[dec,
Function[Typed[arg, "ListVector"::["CLong"]],
Module[{carr},
carr = CreateTypeInstance["Managed"::["CArray"::["CLong"]], arg];
LibraryFunction["sumArray"][carr, Length[arg]]
]
]]cf[Range[100]]cf = FunctionCompile[
Function[Typed[arg, "MachineInteger"],
Module[{carr},
carr = CreateTypeInstance[ "CArray"::["Real64"], arg];
DeleteObject[carr]
]
]]cf[10]可能存在的问题 (1)
在 "Managed" 对象之外创建的 C 数组不会自动进行内存管理,必须手动释放. 编译一个可以创建非托管 C 数组的函数:
cf1 = FunctionCompile[Function[{},
With[{carr = CreateTypeInstance["CArray"::["Integer8"], 100]},
Null
]]]With[{before = MemoryInUse[]}, Do[cf1[], 10];MemoryInUse[] - before]使用 DeleteObject 手动释放 C 数组:
cf2 = FunctionCompile[Function[{},
With[{carr = CreateTypeInstance["CArray"::["Integer8"], 100]},
DeleteObject[carr]
]]]With[{before = MemoryInUse[]}, Do[cf2[], 10];MemoryInUse[] - before]技术笔记
历史
2022年引入 (13.1)