[英]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.