我需要將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