Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

[v8] 模板函数的自动句柄管理

  在v8中创建一个JavaScript函数一般使用函数模板(FunctionTemplate),但是使用模板创建的函数属于内部函数,它自带了句柄管理。或者说在调用它们时会自动创建HandleScope,调用结束时候会自动销毁。所以在函数模板中创建并返回的对象都是重建句柄的。
#include <node.h>
#pragma comment(lib,"node.lib")
using namespace v8;

Handle<Value> func(const Arguments &args){
  printf("%d\n",HandleScope::NumberOfHandles()); //输出初始句柄数量
  auto s=String::New("test"); //创建了一个句柄
  auto h1=Object::New(); //创建了一个句柄
  auto h2=Object::New(); //创建了一个句柄
  printf("%d\n",HandleScope::NumberOfHandles()); //输出当前句柄数量
  return s; //没做任何句柄回收,直接返回,内部会自动回收
};

int main(void){
  auto f=FunctionTemplate::New(func)->GetFunction(); //创建函数模板
  auto o=Object::New(); //创建调用对象
  //调用两次
  f->Call(o,0,0);
  f->Call(o,0,0);
  return 0;
}

NODE_MODULE(test,main);

  第二次调用时句柄会比原来多一个,那是因为第一次调用之后f的返回值在main函数中产生了一个新句柄。但是func函数里面的所有句柄都被回收了,而代码中甚至连HandleScope都没为它创建。
  在NodeJS的C++插件中的函数就是模板方式定义的,所以可以不用创建HandleScope。但无论是v8还是node,官方的例子都会对模板函数创建HandleScope。这种机制本身就是为了防止别人不创建或忘记创建HandleScope带来的内存泄露问题,所以正确的逻辑是应该给每个模板函数都创建HandleScope。
  总之,从这些机制上来看,函数模板生成的函数调用效率并不如直接在JavaScript中定义的高,所以我们在代码中应该尽量减少他们的调用次数。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^