next up previous contents index
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
$2 ¥times 2$の大きさの行列のメモリを表している。
  
図 B.2: 行列のメモリ管理(1)
¥includegraphics[width=0.5¥linewidth]{Fig/mem0.eps}

関数が実行されて,式(1)の右辺が評価されたときのメモリの状態は 図 B.3のようになっている。
  
図 B.3: 行列のメモリ管理(2)
¥includegraphics[width=0.5¥linewidth]{Fig/mem1.eps}

式(1)の右辺が左辺に代入されたときのメモリ状態は図 B.4 のようになる。
  
図 B.4: 行列のメモリ管理(3)
¥includegraphics[width=0.5¥linewidth]{Fig/mem2.eps}

同様に式(2)の代入の後,メモリ状態は図 B.5のようになる。
  
図 B.5: 行列のメモリ管理(4)
¥includegraphics[width=0.5¥linewidth]{Fig/mem4.eps}

式(3)の右辺が評価されたときのメモリの状態は 図 B.6のようになっている。
  
図 B.6: 行列のメモリ管理(5)
¥includegraphics[width=0.5¥linewidth]{Fig/mem5.eps}

式(3)の右辺が左辺に代入されたときのメモリ状態は図 B.7 のようになる。
  
図 B.7: 行列のメモリ管理(6)
¥includegraphics[width=0.5¥linewidth]{Fig/mem6.eps}

式(4)の右辺が評価されたときのメモリの状態は 図 B.8のようになっている。 d, e, fには,それぞれ(A + B), (A - B), (A + B)*(A - B)の計算結果が入っている。
  
図 B.8: 行列のメモリ管理(7)
¥includegraphics[width=0.5¥linewidth]{Fig/mem7.eps}

式(4)の右辺が左辺に代入されたときのメモリ状態は図 B.9 のようになる。 (A + B)*(A - B)の計算結果であるfだけがVAR状態となり, deREV状態となる。
  
図 B.9: 行列のメモリ管理(8)
¥includegraphics[width=0.5¥linewidth]{Fig/mem8.eps}

式(5)の右辺が評価されたときのメモリの状態は 図 B.10のようになっている。d, e, gには, それぞれ(C + D), (C - D), (C + D)*(C - D)の計算結果が入っている。 deREV状態からgSYS状態から TMP状態に移った。
  
図 B.10: 行列のメモリ管理(9)
¥includegraphics[width=0.5¥linewidth]{Fig/mem9.eps}

式(5)の右辺が左辺に代入されたときのメモリ状態は図 B.11 のようになる。 (C+D)*(C-D)の計算結果であるgだけがVAR状態となり, deREV状態となる。
  
図 B.11: 行列のメモリ管理(10)
¥includegraphics[width=0.5¥linewidth]{Fig/mem10.eps}

関数が終了したときのメモリの状態は図 B.12のようになる。 VAR状態にあったメモリが全てTMP状態となる。
  
図 B.12: 行列のメモリ管理(11)
¥includegraphics[width=0.5¥linewidth]{Fig/mem11.eps}


  
図 B.13: 行列のメモリ管理(12)
¥includegraphics[width=0.5¥linewidth]{Fig/mem12.eps}

関数の戻り値が変数に代入されるとTMP状態にある全てのメモリが REV状態に移り,メモリの状態は図 B.13のようになる。 次に,この関数が呼び出されるときは,全てのメモリはREV状態から 確保されることになる。
next up previous contents index
Next: 演算 Up: メモリ管理 Previous: 行列クラスのメモリ管理
Masanobu KOGA 平成10年8月19日