我需要将float32(或字节)的大块从C传递给go库。从c传递片段给golang做内存拷贝?
下面是代码:
package main
import (
"C"
"fmt"
)
//export PrintInt
func PrintInt(x []float32) {
fmt.Println(x)
}
func main() {}
后与go build -buildmode=c-archive foo.go
编译它,我得到了foo.h
,在这里它的一部分的:
typedef GoInt64 GoInt;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;
#endif
/* End of boilerplate cgo prologue. */
#ifdef __cplusplus
extern "C" {
#endif
extern void PrintInt(GoSlice p0);
#ifdef __cplusplus
}
#endif
你可以看到,类型GoSlice
在foo.h
包含指向数据的指针(void *data
)。那么foo.h
中的PrintInt
的实现是否会执行该数据的隐式副本?
你是如何从C到Go的切片?如果你在C中创建切片头,答案应该很明显,因为切片头包含指向底层数组的指针。 – JimB
@JimB你可能是对的,这是最合理的实现。但界面并不禁止执行复制。 –
不会有这种情况发生。 C和Go都不会隐式分配新内存,复制相关数组,并将_different_值传递给函数。 Go在所有情况下都是按值传递的,这里的值是切片头,没有别的。 – JimB