5

golang の gc が十分に効果的ではないため、大量のオブジェクト (約 1 億オブジェクト) をメモリに malloc したいので、c/c++ を使用してメモリを malloc し、std::vector を使用してオブジェクトを保持する必要があります。これは私のコードです。cgo で std コンテナーを使用したいです。

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.

インクルードパスを設定するにはどうすればよいですか、それとも別のアイデアがありますか?

4

3 に答える 3

6

CGo で C++ を使用できますが、そのコードを.goファイル内に埋め込むことはできません。これは、最終的に C コンパイラでビルドされるためです。

代わりに、ファイルと同じディレクトリ内dosomeの別のファイルに関数を配置し、C リンケージを使用するように関数を宣言します。例えば:.cpp.go

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

ファイル内の CGo コメントに関数のプロトタイプを含める.goと、Go から呼び出すことができます。

現在複数のファイルがあるため、省略形を使用することはできませんgo run foo.go(単一のファイルしかコンパイルしないため)。代わりに、go run packageまたはを使用する必要go build packageがあります。コードは にあります$GOPATH/src/package

于 2015-02-01T14:35:38.737 に答える
4

うーん、あなたの結論は少し速すぎると思います。GC コストは次の 2 つの要因によって決まります。プログラムが生成するガベージが増えるほど、GC を実行する必要が大きくなります。2 つ目: スキャンするポインターが多いほど、1 回の GC にかかる時間が長くなります。

つまり、1 億個のデータを go スライスに入れて保持している限り、ガベージがないため、GC をあまり実行する必要はありません。2 つ目: オブジェクトにポインターが含まれていない場合、GC 時間は問題ありません。

だから、私の質問は、あなたのものにはポインターがありますか?

于 2015-02-01T15:00:41.313 に答える