"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から始まる.
変換
- 配列型は管理されたC配列にCastすることができる.サポートされる配列型には"ListVector","NumericArray","PackedArray"がある.
- CastはC配列を未加工のポインタにビットキャストしたり未加工のポインタからビットキャストするために使うことができる.
配列
"RawPointer"および"OpaqueRawPointer"
例題
すべて開く すべて閉じる例 (3)
メモリ管理されたC配列を作成し,その要素の中の一つにアクセスする:
cf = FunctionCompile[Function[{}, Module[{carr},
carr = CreateTypeInstance["Managed"::["CArray"::["MachineInteger"]], {3, 1, 4}];
FromRawPointer[carr, 2]
]]]cf[]dec = LibraryFunctionDeclaration["sumArray", "compilerDemoBase", {"CArray"::["CLong"], "CLong"} -> "CInt"];C配列を作成しその関数を呼び出すプログラムをコンパイルする:
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)