"CString" (编译类型)
"CString" (编译类型)
"CString"
代表一个与 C 语言兼容的字符串.
函数构造
- 除非用 "Managed" 包装,否则用 CreateTypeInstance 构建的 C 语言字符串不会自动进行内存管理,必须用 DeleteObject 手动释放. »
- CreateTypeInstance["CString",str] 根据 "String" str 构建 C 语言字符串.
- CreateTypeInstance["CString",len] 构建长度为 len 的 C 语言字符串.
- CreateTypeInstance["CString",cstr,len] 为长度为 len 的 cstr 构建一个副本. 若 cstr 短于 len,则可能引发崩溃.
- CreateTypeInstance["CString",cstr] 构建一个以零结尾的字符串 cstr 的副本. 如果 cstr 并非以零结尾,则可能会引发崩溃.
转换
- 数组类型的范围包括从 Cast 到托管的 C 语言字符串. 支持的数组类型包括 "ListVector"、"NumericArray" 和 "PackedArray".
- Cast 可用于将 "String" 对象转换为托管的 C 语言字符串.
- Cast 可用于 C 语言字符串和原始指针之间相互进行 bitcast 转换.
数组
"String"
"RawPointer" 和 "OpaqueRawPointer"
范例
打开所有单元 关闭所有单元基本范例 (1)
范围 (2)
使用 C 标准库中的 atof 库函数编译一个将 C 字符串解析为数字的函数:
cf = FunctionCompile@Function[{},
Module[{cstr},
cstr = TypeHint["3.14", "CString"];
LibraryFunction["atof"][cstr]
]
]cf[]将 "CInt" 转换为字符串,并将其存储在大小为 512 的托管 C 字符串中:
libDecl = LibraryFunctionDeclaration[
"snprintf",
{"CString", "CInt", "CString", "CInt"} -> "Integer32"
];
fun = Function[{Typed[n, "CInt"]},
Module[{size, cstr, fmt, err},
size = TypeHint[512, "CInt"];
cstr = CreateTypeInstance["Managed"::["CString"], size];
fmt = TypeHint["%d", "CString"];
err = LibraryFunction["snprintf"][cstr, size, fmt, n];CreateTypeInstance["String", cstr]
]
];
func = FunctionCompile[libDecl, fun]func[42]//InputForm可能存在的问题 (1)
在 "Managed" 对象之外创建的 C 语言字符串不会被自动管理内存,必须手动释放. 编译一个创建非托管 C 语言字符串的函数:
cf1 = FunctionCompile[Function[{},
With[{carr = CreateTypeInstance["CString", 100]},
Null
]]]With[{before = MemoryInUse[]}, Do[cf1[], 10];MemoryInUse[] - before]使用 DeleteObject 来手动释放 C 语言字符串:
cf2 = FunctionCompile[Function[{},
With[{carr = CreateTypeInstance["CString", 100]},
DeleteObject[carr]
]]]With[{before = MemoryInUse[]}, Do[cf2[], 10];MemoryInUse[] - before]技术笔记
历史
2022年引入 (13.1)