2015-02-01 4 views
2

Я хочу malloc большое количество объектов в памяти (около 100 миллионов объектов), потому что gc golang недостаточно эффективен, поэтому мне нужно использовать c/C++ для памяти malloc и использовать std :: vector для хранения объектов , это мой код, я хочу использовать зЬй контейнер в ОЦП:Как использовать std :: вектор или другой контейнер в cgo of golang?

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. 

, как я могу установить путь включать или есть другая идея?

ответ

5

Хотя вы можете использовать C++ с CGo, вы не можете вставлять этот код в файл .go, так как он в конечном итоге создается с помощью компилятора C.

Вместо этого поместите функцию dosome в отдельный файл .cpp в тот же каталог, что и файл .go, и объявите, что ваша функция использует ссылку C. Например:

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

Если включить прототип функции в ОЦП комментарии в файле .go, так что вы можете вызвать его из Go.

Поскольку у вас сейчас несколько файлов, вы больше не можете использовать стенографию go run foo.go (так как она только компилирует один файл). Вместо этого вам нужно будет использовать go run package или go build package, где ваш код расположен по адресу $GOPATH/src/package.

+0

это работает! благодаря !! –

+0

но похоже, что cgo очень медленнее? http://stackoverflow.com/questions/28272285/why-is-cgos-performance-is-so-slow-is-there-something-wrong-with-my-testing-co –

4

Uhh Я думаю, что ваши выводы слишком быстры. Стоимость GC обусловлена ​​двумя вещами: чем больше мусора вы выведет ваша программа, тем больше GC будет работать. Во-вторых: чем больше указателей на сканирование, тем больше будет один GC.

То есть, до тех пор, пока вы ставите свои 100 миллионов вещей в кусок рта и держите их там: GC не придется много бегать, потому что нет мусора. И второе: если ваши вещи не содержат указателей, время GC, если оно все еще произойдет, будет в порядке.

Итак, мой вопрос: у ваших вещей есть указатели?

+0

большое спасибо. Кажется, я полностью ошибаюсь! –

+0

Функция cgo кажется намного медленнее, чем функция go? http://stackoverflow.com/questions/28272285/why-is-cgos-performance-is-so-slow-is-there-something-wrong-with-my-testing-co –