Next: 演算
Up: メモリ管理
Previous: 行列クラスのメモリ管理
メモリの状態遷移の様子を次の例題を使って示す。
Func Matrix afo()
{
Matrix A, B, C, D, E;
A = [[1 2][3 4]]; // (1)
B = [[5 6][7 8]]; // (2)
C = A + B; // (3)
D = (A + B) * (A - B); // (4)
E = (C + D) * (C - D); // (5)
return E; // (6)
}
プログラムが実行される前のメモリの状態は図 B.2のように
なっている。ただし,a, b, ..., kは
の大きさの行列のメモリを表している。
関数が実行されて,式(1)の右辺が評価されたときのメモリの状態は
図 B.3のようになっている。
式(1)の右辺が左辺に代入されたときのメモリ状態は図 B.4
のようになる。
同様に式(2)の代入の後,メモリ状態は図 B.5のようになる。
式(3)の右辺が評価されたときのメモリの状態は
図 B.6のようになっている。
式(3)の右辺が左辺に代入されたときのメモリ状態は図 B.7
のようになる。
式(4)の右辺が評価されたときのメモリの状態は
図 B.8のようになっている。
d, e, fには,それぞれ(A + B), (A - B),
(A + B)*(A - B)の計算結果が入っている。
式(4)の右辺が左辺に代入されたときのメモリ状態は図 B.9
のようになる。
(A + B)*(A - B)の計算結果であるfだけがVAR状態となり,
dとeはREV状態となる。
式(5)の右辺が評価されたときのメモリの状態は
図 B.10のようになっている。d, e, gには,
それぞれ(C + D), (C - D),
(C + D)*(C - D)の計算結果が入っている。
dとeはREV状態からgはSYS状態から
TMP状態に移った。
式(5)の右辺が左辺に代入されたときのメモリ状態は図 B.11
のようになる。
(C+D)*(C-D)の計算結果であるgだけがVAR状態となり,
dとeはREV状態となる。
関数が終了したときのメモリの状態は図 B.12のようになる。
VAR状態にあったメモリが全てTMP状態となる。
関数の戻り値が変数に代入されるとTMP状態にある全てのメモリが
REV状態に移り,メモリの状態は図 B.13のようになる。
次に,この関数が呼び出されるときは,全てのメモリはREV状態から
確保されることになる。
Next: 演算
Up: メモリ管理
Previous: 行列クラスのメモリ管理
Masanobu KOGA
平成10年8月19日