Cからgoライブラリにfloat32(またはバイト)の大きなチャンクを渡す必要があります。ここで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
)を保持します。したがってPrintInt
の実装はfoo.h
にそのデータの暗黙のコピーを行いますか?
CからGoにスライスをどのように渡していますか? Cでスライスヘッダーを作成している場合は、そのスライスヘッダーには基本配列へのポインターが含まれているため、答えは明白です。 – JimB
@JimBあなたはおそらく正しいでしょう、それは最も合理的な実装です。しかし、インタフェースは、実装がコピーを作成することを禁じていません。 –
それが起こる可能性はありません。 CやGoは、暗黙的に新しいメモリを割り当てたり、関連する配列をコピーしたり、_different_値を関数に渡したりすることはありません。 Goはすべての場合において値渡しであり、ここでは値はスライスヘッダーであり、それ以外の値はありません。 – JimB