シフト、プッシュ、ポップは配列の要素を追加/削除するための配列メソッドですが、実際に何が起こっているのかは不明です。例えば、配列の最後の要素を取り除くメソッドpopと言ってください。スタックで使用されているLIFO命令が思い出されますが、アセンブリプログラミングのように要素が実際には「ポップ」されていないと仮定します。むしろ配列全体のインデックスがシフトされる。私は本当に誰も私を助けることができたら私は本当にそれを感謝するだろうか分からない。Ruby:Shift、Push、Pop in Memory
0
A
答えて
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は大きなメモリを活用しますが、時間を節約します。公式はメモリを消費しませんが、より多くの時間がかかります...
関連する問題
- 1. preallocated memory in java
- 2. VisualC++ in memory Uncompression
- 3. Neo4j in memory db
- 4. PyGame - Draw in Memory
- 5. POP-UP LOV in APEX 5
- 6. 3D Peek and POP in swift
- 7. Nuget Push in VS2017
- 8. jax-rs in weblogic high memory
- 9. angular2-in-memory-web-api 404エラー
- 10. angular2 http.delete on in-memory-web-api
- 11. SqLite in memory DBとNHibernate
- 12. In Memory Query to datatableエラー
- 13. Push Notification in android c2dm
- 14. 「#pragma managed(push、off)」と「#pragma managed(pop)」の意味は何ですか?
- 15. javascript、配列のソート関数pop()とpush()の後ろのメカニック
- 16. Apple Push Notification Development in Objective-C
- 17. Web Push Notification in Rails 5
- 18. NHibernate Unit Mocking/In Memoryデータベースのテスト
- 19. Angular-in-memory-web-apiの複数のコレクション
- 20. PUSH/POP命令はRISCまたはCISCと見なされますか?
- 21. POPメソッドリンクリスト
- 22. Angular2でangular-in-memory-web-apiを使用するには?
- 23. SqLiteを使用してIn-Memory DBにストアドプロシージャを追加する
- 24. Angular 2 RC angle2-in-memory-web-apiとは何ですか?
- 25. ヒーローズツアー "angular-in-memory-web-api"に関するチュートリアルの問題
- 26. 分散コンピューティング用のHazelcast-in-memory形式(静的解析)
- 27. (SystemJS)プロバイダの解析エラー:(...)angular2-in-memory-web-apiを使用
- 28. ヒーローズの角膜チュートリアル404 in-memory-web-apiのエラー
- 29. 現在.NETにNoSQL IN-Memoryデータベースソリューションがありますか?
- 30. "cv :: Exception in memory location"の原因を調べる方法は?
悪いチェックアウトのCソースコード。私は興味がある。 –
@BhubhuHbuhdbus少しのアップデート:)私はCのコードも調べました。 – texasbruce