ホームページ > バックエンド開発 > Golang > runtime.Pinner を使用して Go から C に 2D 配列を渡します

runtime.Pinner を使用して Go から C に 2D 配列を渡します

PHPz
リリース: 2024-02-12 17:51:05
転載
613 人が閲覧しました

runtime.Pinner を使用して Go から C に 2D 配列を渡します

質問内容

GoからC関数に2D配列を渡そうとしていますvoid foo(in **float, out *double)。この C 関数のラッパーが必要なので、Go 関数に func FooWrapper([][]float32) []float64 のような定義を持たせます。最も単純ですが、あまり効率的ではない実装は、以下に示す C 経由ですべてのメモリを割り当てることです。 リーリー

そのような実装は安全ですか?

result データへのポインタを渡すことはできますか?私の知る限り、このポインターは C 関数に渡されるため固定されます。

しかし、割り当てられるメモリを減らして Go メモリだけを再利用したいのですが、

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 サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート