2017-04-27 6 views
0

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にそのデータの暗黙のコピーを行いますか?

+0

CからGoにスライスをどのように渡していますか? Cでスライスヘッダーを作成している場合は、そのスライスヘッダーには基本配列へのポインターが含まれているため、答えは明白です。 – JimB

+0

@JimBあなたはおそらく正しいでしょう、それは最も合理的な実装です。しかし、インタフェースは、実装がコピーを作成することを禁じていません。 –

+0

それが起こる可能性はありません。 CやGoは、暗黙的に新しいメモリを割り当てたり、関連する配列をコピーしたり、_different_値を関数に渡したりすることはありません。 Goはすべての場合において値渡しであり、ここでは値はスライスヘッダーであり、それ以外の値はありません。 – JimB

答えて

1

私は横からデータを修正しようとしましたが、それはCに反映されているので、同じメモリを共有しています。

foo.go:

package main 

import (
    "C" 
    "fmt" 
) 

//export PrintInt 
func PrintInt(x []float32) { 
    fmt.Println(x) 
    for i := range x { 
     x[i] = -float32(i) 
    } 
} 

func main() {} 

のfoo.c:コマンドで

#include <stdio.h> 

#include "foo.h" 

int main() { 
    float bar[32]; 
    for(int i = 0; i < 32; i++) { 
    bar[i] = i; 
    } 

    GoSlice s; 
    s.data = (void*)bar; 
    s.len = 32; 
    s.cap = 32; 
    PrintInt(s); 

    for(int i = 0; i < 32; i++) { 
    printf("%f ", bar[i]); 
    } 

    return 0; 
} 

go build -buildmode=c-archive foo.go 
cc foo.c foo.a -o 123 && ./123 

Iまし出力:

[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 -0.000000 -1.000000 -2.000000 -3.000000 -4.000000 -5.000000 -6.000000 -7.000000 -8.000000 -9.000000 -10.000000 -11.000000 -12.000000 -13.000000 -14.000000 -15.000000 -16.000000 -17.000000 -18.000000 -19.000000 -20.000000 -21.000000 -22.000000 -23.000000 -24.000000 -25.000000 -26.000000 -27.000000 -28.000000 -29.000000 -30.000000 -31.000000

関連する問題