2015-02-01 3 views
2

golang의 gc가 충분히 효과적이지 않기 때문에 많은 수의 객체를 메모리에 malloc하고 싶습니다. (약 1 억 개의 객체) malloc 메모리에 c/C++를 사용하고 std :: vector를 사용하여 객체를 보유해야합니다. .std :: vector 또는 golang의 cgo에서 다른 컨테이너를 사용하는 방법?

package main 

import (
    "fmt" 
) 

/* 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <vector> 


using namespace std; 

void dosome(){ 
    vector<int> ivec; // empty vector 
    for (vector<int>::size_type ix = 0; ix != 10; ++ix) 
     ivec[ix] = ix; // disaster: ivec has no elements 
} 

*/ 
// #cgo LDFLAGS: -lstdc++ 
import "C" 

//import "fmt" 
func main() { 

    C.dosome() 

    var input string 
    fmt.Scanln(&input) 
} 

을 아래 오류 메시지가 :

go run stddemo.go 
# command-line-arguments 
./stddemo.go:13:10: fatal error: 'vector' file not found 
#include <vector> 
    ^
1 error generated. 

어떻게 내가이 경로를 포함하거나 다른 아이디어가 설정할 수 있습니다 이 난 CGO에서 표준 컨테이너를 사용하려면, 내 코드?

답변

5

CGo와 함께 C++를 사용할 수 있지만 궁극적으로 C 컴파일러로 빌드되므로이 코드를 .go 파일에 포함시킬 수 없습니다.

대신 함수를 .go 파일과 동일한 디렉토리에있는 .cpp 파일에두고 C 링키지를 사용하도록 함수를 선언하십시오. 예를 들면 : 당신이 이동에서 그것을 호출 할 수 있도록

extern "C" { 
    void dosome() { 
     vector<int> ivec; 
     ... 
    } 
} 

당신은 .go 파일의 CGO 주석의 함수에 대한 프로토 타입을 포함합니다.

이제 여러 개의 파일이 있으므로 go run foo.go을 더 이상 사용할 수 없습니다 (하나의 파일 만 컴파일하기 때문에). 대신 코드가 $GOPATH/src/package 인 곳에 go run package 또는 go build package을 사용해야합니다.

+0

작동합니다! 감사 !! –

+0

하지만 자아가 매우 느린 것 같습니다 ?? http://stackoverflow.com/questions/28272285/why-is-cgos-performance-is-so-slow-is-there-something-wrong-with-my-testing-co –

4

어 귀하의 결론이 너무 빠릅니다. GC 비용은 두 가지로 인해 발생합니다. 프로그램에서 발생하는 쓰레기가 많을수록 GC를 더 많이 실행해야합니다. 두 번째 : 포인터가 많을수록 하나의 GC가 오래 걸릴 것입니다.

즉, 1 억 가지를 이동 조각에 넣고 거기에 보관하는 한 : GC는 쓰레기가 없기 때문에 많이 실행할 필요가 없습니다. 두 번째 : 포인터에 포인터가 포함되지 않은 경우 GC 시간이 계속 발생해도 괜찮습니다.

내 질문은 : 귀하의 것들이 포인터가 있습니까?

+0

대단히 감사합니다. 나는 완전히 잘못된 길로 간다! –

+0

cgo 함수가 함수보다 훨씬 느린 것 같습니다. http://stackoverflow.com/questions/28272285/why-is-cgos-performance-is-so-slow-is-there-something-wrong-with-my-testing-co –