C에서 이동 라이브러리로 float32 (또는 byte)의 큰 덩어리를 전달해야합니다. 당신이 그 유형 GoSlice
을 볼 수 있습니다c에서 golang으로 슬라이스를 전달할 때 메모리 복사본이 있습니까?
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
: 그것의 한 부분으로 여기에,
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
을 가지고 : 여기
foo.h
은 데이터 (
void *data
)에 대한 포인터를 보유합니다. 따라서
PrintInt
의 구현은
foo.h
에서 해당 데이터의 암시 적 복사본을 수행합니까?
C에서 이동으로 슬라이스를 전달하는 방법은 무엇입니까? C에서 슬라이스 머리글을 작성하는 경우 슬라이스 머리글에 기본 배열에 대한 포인터가 포함되어 있기 때문에 대답이 명확해야합니다. – JimB
@ JimB 당신이 맞을 것입니다, 가장 합리적인 구현입니다. 그러나 인터페이스는 구현시 사본을 만들 수 없습니다. –
그럴 수 있다는 기대는 없을 것입니다. C 나 Go는 절대 새로운 메모리를 암시 적으로 할당하고 연관된 배열을 복사하며 _different_ 값을 함수에 전달하지 않습니다. Go는 모든 경우에 값으로 전달되며 여기서 값은 슬라이스 헤더입니다. – JimB