GCについて GCとは、「ガーベジコレクタ」の略で、不要になったメモリの解放を自動で行う機能です。 Spinelでは完全なGCをサポートしているわけではありませんが、効率よくメモリを利用する機能が実装されています。 この機能をSpinelではGCと呼ぶことにします。 実行のタイミング GCが呼ばれるタイミングは、以下の通りです。 レベルが下がるとき 命令「GC」が呼ばれたとき プログラムが終了するとき の3つです。 また、ローカル変数がメモリ解放の対象となります。 では例です。
GCのタイミング
    1
    2
    3
    4
    5
    6
    function Func(){
      var a = CButton.Create;
      //ここでGCが行われる
    }

    Func;
GCは上のように、おもにブレースを抜ける点で呼び出されます。 では、GCありとGC無しではメモリのがどう変化するのか見てみましょう。 GCの有効を切り替えるには、SetGCという命令を使用します。 引数にTrueを与えると有効に、Falseを与えると無効になります。
GCあり
    1
    2
    3
    4
    5
    6
    function Func(){
      var a = CButton.Create;
    }

    for(i = 0;i < 1000;Inc(i))
      Func;
GCなし
    1
    2
    3
    4
    5
    6
    7
    SetGC(False); //GCを無効にする
    function Func(){
      var a = CButton.Create;
    }

    for(i = 0;i < 1000;Inc(i))
      Func;
結果です。作者のパソコンでは、
実行結果
GCあり | 約5480KB
GCなし | 約6900KB
でした。 このように、メモリを適宜解放するので、メモリの多量消費を避けることができます。 ただし、GCが有効になっている場合、処理速度が多少落ちます。 その場合は、GCを無効にすることで処理速度を速くすることができます。 また、GCが有効な場合はプログラム終了時に行われるGCで一斉に解放しなくてもすむので、終了処理にかかる時間も短縮できます。 強制的にGCを実行する GCはブレースから抜ける際に実行されます。 ですから、ループ文などではすべてのループが終了しなければGCが実行されることはありません。 その場合は、強制的にGCを呼び出す必要があります。
ループ文
    1
    2
    3
    for(i = 0;i < 1000;Inc(i))
      var a = CObject.Create;
    //抜けるまで解放されない
上のような例では、GCがうまく動作してくれません。 そのため、以下のようにする必要があります。
強制GC
    1
    2
    3
    4
    for(i = 0;i < 1000;Inc(i)){
      var a = CObject.Create;
      GC;
    }
ループの最後にGCを入れます。 こうすることで、毎回GCが呼ばれます。

前へ / index
プログラム言語「Spinel」
Copyright © 2005 - gabyou All Rights Reserved.
NOTES Software.