3 回答
TA贡献1815条经验 获得超13个赞
虽然您可以将 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。
TA贡献1777条经验 获得超3个赞
呃,我觉得你的结论有点太快了。GC 成本由两件事驱动:程序产生的垃圾越多,GC 运行的次数就越多。第二:要扫描的指针越多,单个 GC 花费的时间就越长。
也就是说:只要你把你的 1 亿个东西放到一个 go slice 中并把它们放在那里:GC 就不必运行太多,因为没有垃圾。第二:如果你的东西不包含指针,GC 时间,如果它仍然发生,就可以了。
所以,我的问题是:你的东西有指针吗?
TA贡献2080条经验 获得超4个赞
如果您只想调用某人的 golang 代码,这是一种快速且效率低下的方法:
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;
}
- 3 回答
- 0 关注
- 239 浏览
添加回答
举报