【问题标题】:Inhering node::objectWrap vs class wrapper继承 node::objectWrap 与类包装器
【发布时间】:2014-08-04 18:50:10
【问题描述】:

假设我有一个 C++ 类:

class cClass {
public:
    methodA();
    methodB();
private:
    //private stuff
}

我可以通过两种方式将这个类绑定到 Node:

方法一——直接继承node::objectWrap

class cClass : public node::ObjectWrap {
public:
    static void Init(v8::Handle<v8::Object> exports);
    methodA();
    methodB();
private:
    static v8::Handle<v8::Value> New(const v8::Arguments& args);
    //private stuff
}

通过这种方式,我直接编辑类结构。但是有一个更简单的方法,那就是:

方法二 - 在内部保留对原始类的引用

class cClassWrapper : public node::ObjectWrap {
public:
    static void Init(v8::Handle<v8::Object> exports);
private:
    static v8::Handle<v8::Value> New(const v8::Arguments& args);
    cClass internal_;
}

方法二中的注意事项cClassWrapper只有一个内部字段,即internal_。只是cClassWrappercClass 的用户,cClass 的内部结构未受影响。

显然,方法 II 更容易实现,因为 cClass 的类结构没有受到影响,但我想知道它的缺点是什么(如果有的话?)。当我绕过cClassWrapper 时,v8 的垃圾收集器会继续删除internal_ 吗?

我不确定这两种实现有什么区别。

【问题讨论】:

    标签: c++ node.js v8 node-modules embedded-v8


    【解决方案1】:

    就架构而言,seconds 选项通常更好:您将获得一个与 v8 完全解耦的类。然后可以将其移动到某个外部库,您可以独立跟踪实现和绑定的更改(使用 git 或其他 vcs)等。

    缺点是潜在的性能下降,这可能可以忽略不计。这根本不影响垃圾收集器的行为,ObjectWrap 的所有字段都由ObjectWrap 实现管理。

    【讨论】:

    • 我的意思是额外的方法调用。但这些真的很便宜,而且可能无论如何都会被内联。
    猜你喜欢
    • 2011-09-18
    • 2016-12-05
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多