我想将大量对象malloc到内存中(大约1亿个对象),因为golang的gc不够有效,所以我需要使用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.
我如何设置包含路径还是有其他想法?
答案 0 :(得分:5)
虽然您可以将C ++与CGo一起使用,但您无法在.go
文件中嵌入该代码,因为它最终是使用C编译器构建的。
而是将dosome
函数放在与.cpp
文件相同的目录中的单独.go
文件中,并声明您的函数使用C链接。例如:
extern "C" {
void dosome() {
vector<int> ivec;
...
}
}
如果您在.go
文件的CGo注释中包含该函数的原型,那么您可以从Go调用它。
由于您现在有多个文件,因此无法再使用go run foo.go
简写(因为它只编译单个文件)。相反,您需要使用go run package
或go build package
,代码位于$GOPATH/src/package
。
答案 1 :(得分:4)
也就是说:只要你把你的1亿件东西放进去并将它们放在那里:GC就不会跑得太多,因为那里没有垃圾。第二:如果你的东西不包含指针,GC时间,如果它仍然发生,那就没问题了。
所以,我的问题是:你的东西有指针吗?
答案 2 :(得分:0)
如果您只想调用某人的golang代码,这是一种快速的ram低效方式:
package main
import "C"
import "fmt"
import "unsafe"
func intArrayFromC (src unsafe.Pointer, sz int) []uint64 {
dest := make([]uint64, sz)
copy(dest, (*(*[1000000000]uint64)(unsafe.Pointer(src)))[:sz:sz])// big number dose not affect ram.
return dest
}
//export doPrint
func doPrint(src unsafe.Pointer, sz int){
var numbers []uint64 = intArrayFromC(src, sz);
for i := 0; i < len(numbers); i++ {
fmt.Printf("%d index: %d\n", numbers[i], i)
}
}
func main() {}
和c ++代码:
#include "print.h"
#include <string.h>
#include <vector>
int main() {
std::vector<GoUint64> numbers{99,44,11,00,2,33,44};
while (1) {
doPrint(numbers.data(), numbers.size());
}
return 0;
}