Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么谷歌不希望你使用C++;建设者? /** *表示有符号整数的JavaScript值。 */ 类别V8_导出整数:公共编号{ 公众: 静态本地新建(隔离*隔离,int32_t值); 静态局部NewFromUnsigned(隔离*隔离,uint32_t值); int64_t Value()常量; V8_内联静态整数*Cast(V8::Value*obj); 私人: 整数(); 静态void CheckCast(v8::Value*obj); };_C++_V8 - Fatal编程技术网

C++ 为什么谷歌不希望你使用C++;建设者? /** *表示有符号整数的JavaScript值。 */ 类别V8_导出整数:公共编号{ 公众: 静态本地新建(隔离*隔离,int32_t值); 静态局部NewFromUnsigned(隔离*隔离,uint32_t值); int64_t Value()常量; V8_内联静态整数*Cast(V8::Value*obj); 私人: 整数(); 静态void CheckCast(v8::Value*obj); };

C++ 为什么谷歌不希望你使用C++;建设者? /** *表示有符号整数的JavaScript值。 */ 类别V8_导出整数:公共编号{ 公众: 静态本地新建(隔离*隔离,int32_t值); 静态局部NewFromUnsigned(隔离*隔离,uint32_t值); int64_t Value()常量; V8_内联静态整数*Cast(V8::Value*obj); 私人: 整数(); 静态void CheckCast(v8::Value*obj); };,c++,v8,C++,V8,以上代码来自谷歌的V8引擎。这方面的初始化示例如下: /** * A JavaScript value representing a signed integer. */ class V8_EXPORT Integer : public Number { public: static Local<Integer> New(Isolate* isolate, int32_t value); static Local

以上代码来自谷歌的V8引擎。这方面的初始化示例如下:

     /**
     * A JavaScript value representing a signed integer.
     */
    class V8_EXPORT Integer : public Number {
     public:
      static Local<Integer> New(Isolate* isolate, int32_t value);
      static Local<Integer> NewFromUnsigned(Isolate* isolate, uint32_t value);
      int64_t Value() const;
      V8_INLINE static Integer* Cast(v8::Value* obj);
     private:
      Integer();
      static void CheckCast(v8::Value* obj);
    };
handlex=Integer::New(42);
从源代码中可以看到,他们将构造函数标记为private,并希望您使用新函数创建此类的实例。这不是违反标准的C++设计模式吗?为什么他们不直接重载构造函数而不是创建静态函数呢?当人们试图将一个库从一种语言移植到另一种语言时,通常会看到这种情况(我现在脑子里唯一能想到的就是Xamarin的iOS工具包)


我试着在谷歌上搜索这类约定的名称,但实际上找不到任何名称。

有两种类型的句柄。其中一个是“本地”句柄。如代码所示,本地句柄具有类
Handle

注意:句柄堆栈不是C++调用堆栈的一部分,但 句柄范围嵌入在C++堆栈中。句柄作用域只能是 已分配堆栈,未分配新堆栈

  • 句柄是指向对象的指针。所有V8对象都是使用句柄访问的,因为V8垃圾处理的方式,它们是必需的 收藏家工作

看起来他们使用的是静态工厂方法。当您希望集中创建对象时,这是有意义的,因为它必须以特殊的方式完成。我可以想象,构造函数提供了一个简单有效的整数对象,工厂方法调用其他方法将对象带入一个特殊的初始状态

将构造函数限制为尽可能少也是一个好主意。构造函数应该建立类的不变量。然后,可以通过特殊方法进行附加设置,并且可以在工厂中封装特定初始化对象的创建。

这是一种称为“静态工厂方法”的模式,Joshua Bloch建议将其作为“有效Java”中的第1项。(我几乎可以肯定斯科特·迈尔斯(Scott Myers)在《高效C++》中有一个相同的条目,但目前我没有这本书的副本可供查阅。)

Bloch将通过这种方法而不是普通构造函数创建对象的优点描述为:

  • 此类方法可能具有描述性名称
  • 与构造函数不同,这些方法不需要创建全新的对象,也就是说,它们可以返回以前缓存的对象副本 物体
  • 与构造函数不同,此类方法还可以返回其返回类型的任何子类型的对象
  • 这些方法减少了参数化对象构造的冗长性
这种设计模式也有缺点,它只是在某些情况下的建议


在V8中,为了加快构建速度,列表中的第二点可能是最重要的。我不是V8专家,但它的理念似乎是“事件驱动、单线程”。当许多“事件回调”想要拥有同一个数字时,所有的事件都会得到同一个实例的副本。

< P>用工厂方法抽象出低级C++构造函数的最重要的原因是在这个API中需要组合和构造。大多数工厂方法执行分配。但是,这种分配必须发生在(垃圾收集)JavaScript堆,而不是C++堆。这有几个后果:

  • 我们不能允许在没有分配的情况下构造原始对象,例如在堆栈上

  • 我们不能允许使用C++端的
    new

  • 默认情况下,我们不能允许使用原始指针,因为这会破坏垃圾收集(句柄是GC知道的一个间接寻址,可以为重新定位而更新)


  • 工厂方法有助于强制执行这些限制。

    可能是因为(这里是胡乱猜测)整数和其他与基元相关的类型经常合并在一起,以避免不断创建值?还要注意,工厂方法返回的类型与
    新整数(42)
    返回的类型不同。想想看,这种技术通常被称为“命名构造函数习惯用法”(因为您的(命名的)静态成员函数有效地替换了构造函数。在这种情况下,请查看
    New
    的返回类型。它不返回
    整数
    ,而是返回
    本地
    。这是因为它们需要确保它可以映射到它所表示的JavaScript,因此需要一些额外的簿记,这就是实现ED作为一个围绕整数的包装,没有“标准C++设计模式”。看看C++的构造函数所说的内容。这可能给你一些关于他们推理的线索。好的一般猜测,但是恐怕这个问题对谷歌的问题非常具体。
    Handle<Value> x = Integer::New(42);