如何使用默认值初始化值类型?

fps:

在Java的Valhalla项目中,如何通用地使用其默认值初始化值类型

最初,我认为分配null任何值类型都会执行此初始化。但是,此问题的答案和注释清楚地表明这null是一个引用,因此它与值类型无关(正是由于值类型不是引用,而是直接值这一事实)。

例如,如果我有一个Person价值型与StringValueType nameDateValueType dateOfBirth属性(这里dateOfBirth应该是一个包含嵌套的值类型int yearint month并且int day属性),我怎么能初始化我的Person值类型在一个通用的方法,这样它的属性的值是""用于name(0, 0, 0)(或相应的默认值)dateOfBirth分别用于

更明确地说,如果这是C,我将这样做:

memset(myPersonStructVariable, 0, sizeof(Person));

或在现代C语言中:

struct Person myPersonStructVariable = {0};
乔恩·弗妮:

aconst_null字节码等效于字节码的值类型(即null,这将是引用类型的默认值)vdefault根据最小值类型规范:

6.5 vdefault

操作方式

推送直接值类类型的默认值

格式

vdefault indexbyte1 indexbyte2

...

描述

无符号的indexbyte1和indexbyte2用于在当前类(2.6)的运行时常量池中构造索引,其中索引的值为(indexbyte1 << 8)| 索引字节2。该索引处的运行时常量池项必须是对直接值类类型(4.4.1)的符号引用。类型已解决(5.4.3.1)。

如果尚未初始化指定的类,则将其初始化(5.5)。直接值类类型的默认值(2.3.5)被压入操作数堆栈。

和2.3.5:

2.3.5直接值类类型

...

直接值类类型的默认值是一个类实例,其字段存储其各自类型的默认值。没有直接值类类型的特殊空值。

而从报价这个演讲说:

[默认值]实际上是正确宽度的值,其中全为0。

因此,这类似于您使用C进行的操作memset(myStructVar, 0, size)


当前没有语言支持值类型,因此我们不能说是否会有类似null文字的东西返回值类型的默认值(例如MyValueType x = default(MyValueType)类似的东西),但是字节码存在。该演示文稿还显示了如何使用方法句柄来调用vdefault或者,您必须旋转字节码。

将字段初始化为用户定义的值(例如""for StrinValueType)可能仅通过调用构造函数(或等效的值类型)来进行。但是目前还不清楚,因此我们只能推测。


另外,在此处查看valhalla vm原型的最新草案:http ://mail.openjdk.java.net/pipermail/valhalla-dev/2017-December/003631.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章