Я знаю, что shift, push и pop - это методы Array, используемые для добавления/удаления элементов массива, но я не уверен, что происходит в памяти. Скажем, например, метод pop, который удаляет последний элемент массива. Это напоминает мне порядок LIFO, используемый в стеке, но я предполагаю, что этот элемент на самом деле не «выскочил», как в программировании сборки; что индекс всего массива смещается. Я действительно не знаю, если бы кто-нибудь мог мне помочь, я бы очень признателен.Ruby: Shift, Push и Pop в памяти
ответ
Ruby предназначен для программистов, которые страдают от идеи, что у вас есть. Мы доверяем тем программистам, которые делают эту реализацию, что они могут сделать лучше всего в оптимизации производительности и управления памятью.
Если вы просто любопытно, вот код для массива # сдвига в Rubinius:
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. То, что он делает, просто помещает начальную позицию в следующую. Я не уверен, что они выпустят пространство, которое он использовал (что, как я полагаю, будет), потому что вам нужно копать глубже.
В официальном 1.9.3 я не знаю, как это реализовано, так как они делают это на C, и их трудно читать. Если вы хотите узнать более подробную информацию, вы можете разблокировать Rubinius на GitHub или разблокировать официальный 1.9.3 с ruby-lang.org и прочитать исходный код. Вы можете узнать больше о программировании 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;
}
Это line:
MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n);
Это говорит нам, что он фактически перемещает смещение блока памяти на n. Вероятно, поэтому чиновник работает медленнее Рубиния ... Рубиний использует большую память, но экономит время; чиновник потребляет меньше памяти, но занимает больше времени ...
- 1. массив push pop in ruby
- 2. Функция Push и Pop
- 3. clojure: pop и push
- 4. Stack Push и Pop
- 5. Javascript display(); нет показов pop, push, unshift, shift?
- 6. Stack push (pop() * pop()) описание
- 7. Ошибка JavaScript Pop/Shift Проблема
- 8. Ruby: `pop`ing одного массива и` push`ing на другой
- 9. Объяснение Push и Pop Loop
- 10. сложность pop, push и multipop
- 11. "PUSH" "POP" Или "MOVE"?
- 12. Как сделать push, unshift, pop и shift работать только с локальным массивом в javascript?
- 13. Как написать Push и Pop в схеме?
- 14. push и pop matrix в стеке (openGL)
- 15. Код для push и pop в perl?
- 16. используя «push» и «pop» в стеке
- 17. Написание push и pop в c
- 18. push и pop фрагментов в android
- 19. C++ Vector push/pop
- 20. понимание heapq push pop
- 21. Stack push pop rotate
- 22. PUSH/POP в сборке ARMv5
- 23. Проблема в UIViewController push & pop
- 24. Push and Pop в руке
- 25. Соединяется быстрее, чем Shift + Pop? Зачем?
- 26. Использование .slice и .shift в ruby
- 27. stack, push и pop in python
- 28. push и pop контроллер медленный ответ
- 29. Стек массив с помощью pop() и push()
- 30. Структура связанного списка Push и Pop
плохо проверить исходный код c. мне любопытно. –
@BhubhuHbuhdbus Небольшие обновления :) Я тоже прошел код C. – texasbruce