[1363] 配列の実装について
投稿者:山
2009/06/17 20:11:21
配列の実装は、結果的にまったく違うものになっています。配列領域を固定で
スタックに持つことでGCを無くす。この目的のために結果的に多くの修正をしま
した。下記のようなプログラムとディスアセンブルコードを見てください。
この並列はずいぶん悩みましたが、結果的に一番良いであろう方法に落ち着き
ました。
----------------------------------
int main()
{
int[2][3] i5dim;
int id = 33;
boolean[2] bdim1 = { true , false };
int[2][3] idim21 = {{1,2,3},{4,300,65536}};
int[2][3][4] idim3 = {{{1,2,3,4},{5,6,7,300},{8,9,10,11}},
{{11,12,13,65536},{14,15,16,17},{18,19,20,21}}};
double[4] ddim1 = { 0.0, 1.0, 4.1, 5.1 };
string[5] sdim1 = {"aa","bb","cc","dd","ee"};
int a1;
i5dim[1][2] = 1;
a1 = i5dim[i5dim[1][2]][0];
}
----------------------------------
↓
下記のように、配列の定数は配列定数バッファーに詰め込んで保持し、1命令で
配列変数に書き込みです。もちろん配列数と一致したデータ以外はエラーです。
また、変数の配列次元数が一致しない場合もエラーになる処理が入っています。
int[10] P; P = P; の様なポインター的なコードが書けない仕様です。
↓
バイトコード
↓
1:*** 一般関数情報ダンプ ******************
1:int main()
1:*** ローカル変数の表示 no = 8 ***
1: 0:int [2][3] i5dim
1: 1:int id
1: 2:boolean [2] bdim1
1: 3:int [2][3] idim21
1: 4:int [2][3][4] idim3
1: 5:double [4] ddim1
1: 6:string [5] sdim1
1: 7:int a1
1:*** 配列定数 数 = 5 **********
1: 0:int 配列 [2] size=20
1:int[0] = 1
1:int[1] = 0
1: 1:int 配列 [2][3] size=36
1:int[0][0] = 1
1:int[0][1] = 2
1:int[0][2] = 3
1:int[1][0] = 4
1:int[1][1] = 300
1:int[1][2] = 65536
1: 2:int 配列 [2][3][4] size=108
1:int[0][0][0] = 1
1:int[0][0][1] = 2
1:int[0][0][2] = 3
1:int[0][0][3] = 4
1:int[0][1][0] = 5
1:int[0][1][1] = 6
1:int[0][1][2] = 7
1:int[0][1][3] = 300
1:int[0][2][0] = 8
1:int[0][2][1] = 9
1:int[0][2][2] = 10
1:int[0][2][3] = 11
1:int[1][0][0] = 11
1:int[1][0][1] = 12
1:int[1][0][2] = 13
1:int[1][0][3] = 65536
1:int[1][1][0] = 14
1:int[1][1][1] = 15
1:int[1][1][2] = 16
1:int[1][1][3] = 17
1:int[1][2][0] = 18
1:int[1][2][1] = 19
1:int[1][2][2] = 20
1:int[1][2][3] = 21
1: 3:double 配列 [4] size=44
1:double[0] = 0.000000
1:double[1] = 1.000000
1:double[2] = 4.100000
1:double[3] = 5.100000
1: 4:string_no 配列 [5] size=32
1:string[0] = 9
1:string[1] = 10
1:string[2] = 11
1:string[3] = 12
1:string[4] = 13
1:*** 文字列 数 = 14 ***
1: 0: "main"
1: 1: "i5dim"
1: 2: "id"
1: 3: "bdim1"
1: 4: "idim21"
1: 5: "idim3"
1: 6: "ddim1"
1: 7: "sdim1"
1: 8: "a1"
1: 9: "aa"
1: 10: "bb"
1: 11: "cc"
1: 12: "dd"
1: 13: "ee"
1:*** 使用予定のスタックサイズ = 426
1:*** 関数コードのディスアセンブラ size = 63
1: 0 push_int_1byte 33
1: 2 pop_stack_int 1
1: 5 set_array_literal_int 0 2
1: 10 set_array_literal_int 1 3
1: 15 set_array_literal_int 2 4
1: 20 set_array_literal_double 3 5
1: 25 set_array_literal_string 4 6
1: 30 push_int_1byte 1
1: 32 push_stack_array 0
1: 35 push_int_1byte 1
1: 37 push_array_int
1: 38 push_int_1byte 2
1: 40 pop_array_int
1: 41 push_stack_array 0
1: 44 push_stack_array 0
1: 47 push_int_1byte 1
1: 49 push_array_int
1: 50 push_int_1byte 2
1: 52 push_array_int
1: 53 push_array_int
1: 54 push_int_1byte 0
1: 56 push_array_int
1: 57 pop_stack_int 7
1: 60 push_int_1byte 0
1: 62 return
1:*** 行情報 数 = 10 ***
1: 4: from 0 size 5
1: 5: from 5 size 5
1: 6: from 10 size 5
1: 8: from 15 size 5
1: 9: from 20 size 5
1: 10: from 25 size 5
1: 13: from 30 size 11
1: 14: from 41 size 19
1: 19: from 60 size 2
1: 15: from 62 size 1
1:*** end of main() --------------