gpt4 book ai didi

go - golang的cgo中如何使用std::vector或者其他容器?

转载 作者:IT王子 更新时间:2023-10-29 00:51:20 53 4
gpt4 key购买 nike

我想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.

我如何设置包含路径或有其他想法?

最佳答案

虽然您可以将 C++ 与 CGo 一起使用,但您不能将该代码嵌入到 .go 文件中,因为它最终是使用 C 编译器构建的。

相反,将您的 dosome 函数放在一个单独的 .cpp 文件中,该文件位于与 .go 文件相同的目录中,并声明您的函数使用 C 链接。例如:

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

如果您在 .go 文件的 CGo 注释中包含该函数的原型(prototype),那么您可以从 Go 中调用它。

因为你现在有多个文件,你不能再使用 go run foo.go 简写(因为它只编译一个文件)。相反,您需要使用 go run packagego build package,您的代码位于 $GOPATH/src/package

关于go - golang的cgo中如何使用std::vector或者其他容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28263276/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com