2017-04-27 11 views
0

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에서 해당 데이터의 암시 적 복사본을 수행합니까?

+0

C에서 이동으로 슬라이스를 전달하는 방법은 무엇입니까? 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