什么是内部字段计数,SetInternalFieldCount有什么用途?

28

我对SetInternalFieldCount()函数的实际作用感到困惑。在v8文档中,该函数被描述为设置“从此模板生成的对象的内部字段数。”这相当明显但并没有提供更多信息。

v8嵌入者指南中,他们给出了以下示例:

point_templ->SetInternalFieldCount(1); 

并说:“这里内部字段计数设置为1,这意味着对象有一个内部字段,索引为0,指向C++对象。”

但是,什么是内部字段,设置此值实际上告诉程序什么?

1个回答

25

函数SetInternalFieldCount会指示V8为使用模板创建的每个实例分配内部存储槽。 这允许您在这些实例中存储任何类型的信息。

例如,将V8对象与C ++类实例之间的连接存储起来非常有用。

void* p;  // any pointer
Local<Object> obj = point_templ->NewInstance();
obj->SetInternalField(0, External::New(p));      // 0 means 1-st internal field

或用于对齐指针:

obj->SetAlignedPointerInInternalField(0, p);     // 0 means 1-st internal field

在程序的另一个部分,您可以像这样获取指针:

v8::Handle<v8::Object> handle;    // some object handle
if (handle->InternalFieldCount() > 0)
{
    void* p = handle->GetAlignedPointerFromInternalField(0); // from 1-st field
    // ... do something with p, e.g. cast it to wrapped C++ class instance
}

没错。这允许一些C++数据随着对象一起标记,因此当对象模板需要执行查找或设置值等操作时,该数据可用。 - xaxxon
在这种情况下,当JavaScript中的“obj”被GCed时,“p”指向的对象也会被删除吗?(我应该先检查V8源代码。) - Shane Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接