繁体   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