2012-04-21 11 views
0

シフト、プッシュ、ポップは配列の要素を追加/削除するための配列メソッドですが、実際に何が起こっているのかは不明です。例えば、配列の最後の要素を取り除くメソッドpopと言ってください。スタックで使用されているLIFO命令が思い出されますが、アセンブリプログラミングのように要素が実際には「ポップ」されていないと仮定します。むしろ配列全体のインデックスがシフトされる。私は本当に誰も私を助けることができたら私は本当にそれを感謝するだろうか分からない。Ruby:Shift、Push、Pop in Memory

答えて

5

Rubyはあなたが持っているアイデアに苦しんでいるプログラマーのためのものです。実装を行うプログラマは、パフォーマンスとメモリ管理を最適化する上で最善を尽くすことができると信じています。

def shift(n=undefined) 
    Rubinius.check_frozen 

    if n.equal? undefined 
     return nil if @total == 0 
     obj = @tuple.at @start 
     @tuple.put @start, nil 
     @start += 1 
     @total -= 1 

     obj 
    else 
     n = Rubinius::Type.coerce_to(n, Fixnum, :to_int) 
     raise ArgumentError, "negative array size" if n < 0 

     slice!(0, n) 
    end 
end 

そして、あなたが見ることができる、配列自体は、Rubiniusの::タプルで、タプルの定義では、それは次のとおりです。あなただけ興味があれば

は、ここにRubiniusののArray#シフトのためのコードですRubinius :: Arrayそれは、開始位置を次の位置に置くだけです。あなたがもっと深く掘り下げなければならないので、彼らが使用したスペースを解放するかどうかはわかりません。

公式1.9.3では、私はCでどのように実装されているのかわかりませんが、読みにくいです。詳細を知りたい場合は、Rubinius on GitHubをフォークするか、ruby-lang.orgから公式1.9.3をフォークして、ソースコードを読んでください。あなたも、C/C++プログラミング:)


は、だから私はすぐに公式の1.9.3のコードを経ての詳細を学ぶことができ、これは、アレイ#シフト機能の定義である:

static VALUE 
rb_ary_shift_m(int argc, VALUE *argv, VALUE ary) 
{ 
    VALUE result; 
    long n; 

    if (argc == 0) { 
    return rb_ary_shift(ary); 
    } 

    rb_ary_modify_check(ary); 
    result = ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST); 
    n = RARRAY_LEN(result); 
    if (ARY_SHARED_P(ary)) { 
    if (ARY_SHARED_NUM(ARY_SHARED(ary)) == 1) { 
     rb_mem_clear(RARRAY_PTR(ary), n); 
    } 
     ARY_INCREASE_PTR(ary, n); 
    } 
    else { 
    MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n); 
    } 
    ARY_INCREASE_LEN(ary, -n); 

    return result; 
} 

この行:

MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n); 

これは、メモリブロックを実際にnだけ移動させることを示しています。 RubiniusはRubiniusよりも遅く動作するのでしょう... Rubiniusは大きなメモリを活用しますが、時間を節約します。公式はメモリを消費しませんが、より多くの時間がかかります...

+0

悪いチェックアウトのCソースコード。私は興味がある。 –

+0

@BhubhuHbuhdbus少しのアップデート:)私はCのコードも調べました。 – texasbruce

関連する問題