2017年7月9日日曜日

Javaでの、2次元配列 (多次元配列) の作成方法の違いによるバイトコード差異について

Q. Javaでの2次元配列の作成において、「多次元配列風の作法」と「ジャグ配列風の作法」とでは、バイトコードに違いは出るのか?

多次元配列風の作法 ※正式な用語ではない
int[][] a = new int[3][4];
ジャグ配列風の作法 ※正式な用語ではない
int[][] a = new int[3][];
a[0] = new int[4];
a[1] = new int[4];
a[2] = new int[4];
ジャグ配列風の作法 その2
int[][] a = new int[][] {
  new int[4], 
  new int[4], 
  new int[4]};

A. バイトコードに差異は出る。

Javaの仮想マシンは、「多次元配列作成専用のオペコード」(multianewarray)を持っている。

したがって、「多次元配列風の作法」の方が、バイトコードがコンパクトになる。

調査で使用したJavaコンパイラ
javac 1.8.0_25 (Oracle)
Javaソースコードバイトコード
// 多次元配列風
int[][] a = new int[3][4];
ICONST_3
ICONST_4
MULTIANEWARRAY [[I 2
ASTORE 1
// ジャグ配列風
int[][] a = new int[3][];
a[0] = new int[4];
a[1] = new int[4];
a[2] = new int[4];
ICONST_3
ANEWARRAY [I
ASTORE 1

ALOAD 1
ICONST_0
ICONST_4
NEWARRAY T_INT
AASTORE

ALOAD 1
ICONST_1
ICONST_4
NEWARRAY T_INT
AASTORE

ALOAD 1
ICONST_2
ICONST_4
NEWARRAY T_INT
AASTORE
// ジャグ配列風 その2
int[][] a = new int[][] {
  new int[4], 
  new int[4], 
  new int[4]};
ICONST_3
ANEWARRAY [I

DUP
ICONST_0
ICONST_4
NEWARRAY T_INT
AASTORE

DUP
ICONST_1
ICONST_4
NEWARRAY T_INT
AASTORE

DUP
ICONST_2
ICONST_4
NEWARRAY T_INT
AASTORE

ASTORE 1

参考リンク

0 件のコメント :

コメントを投稿