История изменений
Исправление DRVTiny, (текущая версия) :
Слушай, а это у вас там нормально - что-то «базарить» и не приводить никаких аргументов? По делу-то ты ничего не сказал в итоге, но излил изрядно желчи. По-моему это означает, по вашим понятиям, «не отвечать за свой базар».
Я на полном серьёзе считаю, что человек, придумавший Perl Critic - глубоко и безнадёжно болен. Крайним проявлением шизофазии его сторонников является RPerl - неработоспособный компилятор несуществующего языка.
Не спорю, что код, написанный на коленке за 15-ь минут - не блещет. Я уж не говорю о том, что он вообще не для использования в Perl, это просто демонстрация на Perl того, как можно было бы сделать такую вещь на компилируемом ЯП. Причём неполная: необходим по-хорошему кеш отображения индекса в списке в индекс вектора nodes (собственно, запилил и такое).
В реализации на Perl нужны были бы просто: 1) список занятых слотов
2) стек свободных слотов
3) собственно набор слотов
И тогда алгоритм сводился бы в простейшем случае к:
При добавлении:
Если стек «номеров свободных слотов» не пуст - то вытолкнуть из этого стека один номер, втолкнуть его push'ем в список занятых слотов;
Если стек «номеров свободных слотов» исчерпан - сделать shift списка «занятых номеров», записать слот с полученным после shift номером ссылку на данные (перезаписав ту ссылку, которая там была раньше). После этого - остаётся впихнуть номер слота push'ем в «занятые», чтобы он стал в голову списка как «наисвежайший». Таким образом, элемент в хвосте «списка занятых номеров» переместится в его «голову».
При удалении: Просто делается push @stackFreeSlotNums, splice @listUsedSlotNums, $nStart, $amount;
Проблема только в том, что подобные очень простые и короткие манипуляции с мощными возможностями работы с фиксированным списком как с обычным вектором элементов - их либо нет в компилируемых языках, либо они реализованы всё-таки тоже какими-то грудами кода.
Я к тому веду, что в реальном машинном коде никаких shift'ов для областей памяти не существует - есть только malloc статичного куска памяти, а дальше уж как хочешь, так и используй его.
Моя идея - в том, чтобы не пользуясь никакими магическими пассами с модификацией векторов (ОЗУ не может просто так «испариться» где-то в середине последовательности машинных слов) тем не менее реализовать возможность «удаления» элементов. Пока в моей задумке я вижу один очевидный недостаток: последовательный доступ к элементам двухсвязного списка конечно совсем не последователен - а это, как здесь правильно заметили, может здорово замедлить работу процессора с памятью.
Исправление DRVTiny, :
Слушай, а это у вас там нормально - что-то «базарить» и не приводить никаких аргументов? По делу-то ты ничего не сказал в итоге, но излил изрядно желчи. По-моему это означает, по вашим понятиям, «не отвечать за свой базар».
Я на полном серьёзе считаю, что человек, придумавший Perl Critic - глубоко и безнадёжно болен. Крайним проявлением шизофазии его сторонников является RPerl - неработоспособный компилятор несуществующего языка.
Не спорю, что код, написанный на коленке за 15-ь минут - не блещет. Я уж не говорю о том, что он вообще не для использования в Perl, это просто демонстрация на Perl того, как можно было бы сделать такую вещь на компилируемом ЯП. Причём неполная: необходим по-хорошему кеш отображения индекса в списке в индекс вектора nodes (собственно, запилил и такое).
В реализации на Perl нужны были бы просто: 1) список занятых слотов
2) стек свободных слотов
3) собственно набор слотов
И тогда алгоритм сводился бы в простейшем случае к: вытолкнуть из стека свободных слотов, втолкнуть в список занятых слотов - при добавлении
сделать splice элемент(а/ов) из списка занятых слотов - втолкнуть эти индексы в стек свободных слотов
если при добавлении стек свободных слотов исчерпан - сделать shift списка занятых, записать по этому индексу данные в соотв. слот (перезаписав те, что там были раньше), впихнуть индекс push'ем в «занятые», чтобы он стал в голову списка: таким образом элемент в хвосте «занятых» переместится в его «голову».
Проблема только в том, что подобные очень простые и короткие манипуляции с мощными возможностями работы с фиксированным списком как с обычным вектором элементов - их либо нет в компилируемых языках, либо они реализованы всё-таки тоже какими-то грудами кода.
Я к тому веду, что в ральном машинном коде никаких shift'ов для областей памяти не существует - есть только malloc статичного куска памяти, а дальше уж как хочешь, так и используй его.
Моя идея - в том, чтобы не пользуясь никакими магическими пассами с модификацией векторов (ОЗУ не может просто так «испариться» где-то в середине последовательности машинных слов) тем не менее реализовать возможность «удаления» элементов. Пока в моей задумке я вижу один очевидный недостаток: последовательный доступ к элементам двухсвязного списка конечно совсем не последователен - а это, как здесь правильно заметили, может здорово замедлить работу процессора с памятью.
Исходная версия DRVTiny, :
Слушай, а это у вас там нормально - что-то «базарить» и не приводить никаких аргументов? По делу-то ты ничего не сказал в итоге, но излил изрядно желчи. По-моему это означает, по вашим понятиям, «не отвечать за свой базар».
Я на полном серьёзе считаю, что человек, придумавший Perl Critic - глубоко и безнадёжно болен. Крайним проявлением шизофазии его сторонников является RPerl - неработоспособный компилятор несуществующего языка.
Не спорю, что код, написанный на коленке за 15-ь минут - не блещет. Я уж не говорю о том, что он вообще не для использования в Perl, это просто демонстрация на Perl того, как можно было бы сделать такую вещь на компилируемом ЯП. Причём неполная: необходим по-хорошему кеш отображения индекса в списке в индекс вектора nodes (собственно, запилил и такое).
В реализации на Perl нужны были бы просто: 1) список занятых слотов
2) стек свободных слотов
3) собственно набор слотов
И тогда алгоритм сводился бы в простейшем случае к: вытолкнуть из стека свободных слотов, втолкнуть в список занятых слотов - при добавлении
сделать splice элемент(а/ов) из списка занятых слотов - втолкнуть эти индексы в стек свободных слотов
если при добавлении стек свбодных слотов исчерпан - сделать shift списка занятых, записать в этот индекс данные, впихнуть индекс push'ем, чтобы он стал в голову списка.
Проблема только в том, что подобные очень простые и короткие манипуляции с мощными возможностями работы с фиксированным списком как с обычным вектором элементов - их либо нет в компилируемых языках, либо они реализованы всё-таки тоже какими-то грудами кода.
Я к тому веду, что в ральном машинном коде никаких shift'ов для областей памяти не существует - есть только malloc статичного куска памяти, а дальше уж как хочешь, так и используй его.
Моя идея - в том, чтобы не пользуясь никакими магическими пассами с модификацией векторов (ОЗУ не может просто так «испариться» где-то в середине последовательности машинных слов) тем не менее реализовать возможность «удаления» элементов. Пока в моей задумке я вижу один очевидный недостаток: последовательный доступ к элементам двухсвязного списка конечно совсем не последователен - а это, как здесь правильно заметили, может здорово замедлить работу процессора с памятью.