节点C++插件 - 当类型数组(Float32Array)作为参数传递时,如何访问它?

Node C++ Addon - How do I access a Typed Array (Float32Array) when it's been passed as an argument?

本文关键字:何访问 访问 参数传递 插件 C++ 类型 节点 Float32Array 数组      更新时间:2023-10-16

我想使用V8 Float32Array数据结构。我如何初始化它?

我还对直接访问数据的内存感兴趣。这怎么可能呢?

更新

现在最好的方法是使用辅助对象Nan::TypedArrayContents

assert(args[i]->IsFloat32Array());
Local<Float32Array> myarr = args[i].As<Float32Array>();
Nan::TypedArrayContents<float> dest(myarr);
// Now use dest, e.g. (*dest)[0]

在节点画布中有一个很好的例子。


原始答案,它显示了为什么助手是有用的

v8 API现在变化很快,所以这取决于你的node/io.js版本。要访问作为参数提供的数组中的数据,这应该适用于node0.12到io.js<3.0:

assert(args[i]->IsFloat32Array()); // These type-check methods are available.
Local<Float32Array> myarr = args[i].As<Float32Array>();
void* dataPtr = myarr->GetIndexedPropertiesExternalArrayData();

在io.js>=3.0(v8 4.3)中,您应该使用ArrayBuffer::GetContents。(我还没有用过,3.0发布后会更新。)文档在这里。

在节点0.10中,TypedArray是自制的。这是一种方法:

Local<Object> buffer = args[i]->Get(NanNew("buffer"))->ToObject();
void* dataPtr = buffer->GetPointerFromInternalField(0);

构造类型化数组可以使用:

 Float32Array::New(ArrayBuffer::New(Isolate::GetCurrent(), size * 4), 0, size);