GoからC関数に2D配列を渡そうとしていますvoid foo(in **float, out *double)
。この C 関数のラッパーが必要なので、Go 関数に func FooWrapper([][]float32) []float64
のような定義を持たせます。最も単純ですが、あまり効率的ではない実装は、以下に示す C 経由ですべてのメモリを割り当てることです。
リーリー
result データへのポインタを渡すことはできますか?私の知る限り、このポインターは C 関数に渡されるため固定されます。
runtime.Pinner.Unpin() が呼び出されるまでポインタを固定し続ける
runtime.Pinner について学びました。 。 pinnerを使用して別の実装を書いてみました:
リーリー
リーリー
runtime.Pinner を使用するのは間違っていますか (私の知る限り、スライス データを固定できる)。または、このコードに別のバグがあります。すべてのデータをCメモリに割り当ててコピーする以外に、3D(4Dなど)配列をC関数に渡す実装はありますか? 解決策私の問題に対する答えを見つけました。 malloc を使用するのは危険です。Go ポインタを C メモリに書き込もうとすると、GC が初期化されていないメモリを「不良」メモリとして識別する可能性があるため、malloc を calloc に変更すれば問題はありません。もちろん、これは最善の解決策ではありません。Go でメモリを割り当てるほうが高速かつ安全です。すべてのディスカッション
こちら.一个>
以上がruntime.Pinner を使用して Go から C に 2D 配列を渡しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。