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

Fed*_*ner 4 java initialization value-type project-valhalla

在Java的Project Valhalla的上下文中,我如何使用其默认值一般初始化值类型

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

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

为了更清楚,如果这是C,我会这样做:

memset(myPersonStructVariable, 0, sizeof(Person));
Run Code Online (Sandbox Code Playgroud)

或者在现代C:

struct Person myPersonStructVariable = {0};
Run Code Online (Sandbox Code Playgroud)

Jor*_*nee 6

aconst_null字节码的值类型等价物(即null,它将是参考类型的默认值)是vdefault字节码.从最小值类型规范:

6.5 vdefault

手术

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

格式

vdefault indexbyte1 indexbyte2
Run Code Online (Sandbox Code Playgroud)

...

描述

unsigned indexbyte1和indexbyte2用于构造当前类(2.6)的运行时常量池的索引,其中索引的值为(indexbyte1 << 8)| indexbyte2.该索引处的运行时常量池项必须是对直接值类类型(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