我正在写一个GPU数据库,并且使用javascript作为语言来查询使用node.js.Node.js插件对象破坏
我一直在编写节点插件,因为我已经用C++编写了GPU数据库。不过,我的node.js插件有问题,因为我的C++对象没有被破坏,只是当我没有明确使用new运算符时。如果我正在使用new运算符,那很好,它只是在调用一个创建新方法的方法时 - 比如copy()等。我正在使用V8 :: AdjustAmountOfExternalAllocatedMemory(size())作为V8的指示,分配的外部存储器(在GPU上)。
请给我一些建议。
var gpudb = require('./build/Release/gpudb');
var n = 1000000;
for (var i = 0; i < 10000; ++i) {
var col = new gpudb.GpuArray(n);
}
:
1.一种可正确释放GPU存储器
代码本的代码正确地通过调用对象的析构函数,这使得呼叫以释放GPU存储器释放GPU存储器2.但是,这段代码不会调用对象的析构函数来释放GPU内存。
var gpudb = require('./build/Release/gpudb');
var n = 1000000;
var col = new gpudb.GpuArray(n);
for (var i = 0; i < 10000; ++i) {
var copyOfCol = col.copy();
}
3.现在,这里分别构造函数和复制功能的功能。
Handle<Value> GpuVector::New(const Arguments& args) {
HandleScope scope;
if (args.IsConstructCall()) {
// Invoked as constructor: `new GpuVector(...)`
int value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();
GpuVector* obj = new GpuVector(value);
obj->Wrap(args.This());
return args.This();
} else {
// Invoked as plain function `GpuVector(...)`, turn into construct call.
const int argc = 1;
Local<Value> argv[argc] = { args[0] };
return scope.Close(constructor->NewInstance(argc, argv));
}
}
Handle<Value> GpuArray::Copy(const Arguments& args) {
HandleScope scope;
GpuArray* in = ObjectWrap::Unwrap<GpuVector>(args.This());
GpuArray* out = new GpuArray(in); // creates new gpu memory slot and copies the data over
out->Wrap(args.This());
return args.This();
}