簡體   English   中英

有沒有一種優雅的方法可以通過 cgo 將大字節切片或 io.Reader 傳遞給 c 而無需內存復制?

[英]Is there a graceful way to pass large byte slice or io.Reader to c through cgo without memory copy?

我有一個需要大量數據才能工作的 ac 程序。

假設我有一個 4GB 的字節片,剛從一個大文件、互聯網或套接字加載。

然后我想把它傳遞給cgo。 如果我傳遞一個指向字節緩沖區的指針,緩沖區仍然在 go 中,因為緩沖區可以被垃圾收集,從而在 C 端創建段錯誤。 io.Reader 不能簡單地傳遞給 cgo,因為它太籠統了。

我知道我可以傳遞文件路徑,或者用 C 編寫互聯網請求代碼以避免 cgo 字節傳遞。 但這並不方便,我還是想保持golang方便的優勢。

那么我們如何優雅地處理 cgo 中的大字節傳遞呢? 如果沒有其他選擇,我想確保沒有其他選擇。

如果我傳遞一個指向字節緩沖區的指針,緩沖區仍然在 go 中,因為緩沖區可以被垃圾收集,從而在 C 端創建段錯誤。

只要 C 函數在調用返回后不再引用該指針,就可以安全地將 Go 指針傳遞給 C。 Go 編譯器將在 C 調用期間固定分配。

有關確切的詳細信息,請參閱https://pkg.go.dev/cmd/cgo#hdr-Passing_pointers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM