如何使用WebAssembly的向量(C ++ STL)

时间:2018-05-07 19:14:13

标签: c++14 webassembly

#include <iostream>
#include<vector>
using namespace std;

vector<int> ver;

int pushData(int n)
{
    for(int i=0;i<n;i++)
    {
        ver.push_back(i);
    }
}

我想从JS调用pushData函数并将一些数据推送到vector&#34; ver&#34;并在以后使用它。 请解释如何使用WebAssembly来做到这一点。

2 个答案:

答案 0 :(得分:1)

我尝试通过使用以下答案来回答您的问题: https://stackoverflow.com/a/46748966/544721

提出解决方案:

#include<vector>
const int SIZE = 10;
std::vector<int> data(10);

void add(int value) { 
  for (int i=0; i<SIZE; i++) {
    data[i] = data[i] + value;
  }
}

int* getData() {
  return &(data[0]);
}

和js:

var wasmModule = new WebAssembly.Module(wasmCode);
var wasmInstance = new WebAssembly.Instance(wasmModule, wasmImports);

var offset = wasmInstance.exports.getData();

var linearMemory = new Uint32Array(wasmInstance.exports.memory.buffer, offset, 10);
for (var i = 0; i < linearMemory.length; i++) {
  linearMemory[i] = i;
}

wasmInstance.exports.add(10);

for (var i = 0; i < linearMemory.length; i++) {
  log(linearMemory[i]);
}

WasmFiddle:https://wasdk.github.io/WasmFiddle//?wuycy

但是看起来有一些链接器错误:

line 2: Uncaught LinkError: WebAssembly Instantiation: Import #9 module="env" function="__dso_handle" error: global import must be a number

任何人都可以帮助使此C ++代码在WasmFiddle中运行吗?

答案 1 :(得分:0)

我正在做类似您的事情。我认为在WASM中使用STL非常困难。

我的解决方案是创建一个模拟向量.Wasm仅支持int32,int64,float32和float64,并且wasm的adderess与其他进程不同,因此直接导入该库是不可行的。您可以通过代理或转换来调用库函数,也可以自己编写。

在这种情况下,无法直接导入vector。您可以创建一个名为vector的类,并实现push_back函数。

class vector{
public:
    bool push_back(int i){
       // do something
    }
    int& at(uint index){
       // do something
    }
private:
    int* int_ptr;
}

更多详细信息在这里 https://aransentin.github.io/cwasm/