uCLisp: как избавиться от malloc (почти совсем), но всё равно динамически выделять память

Nov 13, 2015 07:27

А очень просто: чтобы выделить память, ничего не выделяя, надо выделить память заранее!
Вот просто взять и выделить сразу большой кусок, разметить его как список ячеек и назвать сие как-то типа free_nodes_list_ptr.
Когда нужна новая ячейка, отщипывать её от начала списка (передвигая указатель free_nodes_list_ptr на free_nodes_list_ptr->cdr).
Когда ячейку cell высвобождаем, то cell->cdr = free_nodes_list_ptr; free_nodes_list_ptr = cell.
И вуаля, в 99% случаев, когда надо выделить/свободить ячейку, на самом деле не надо будет ничего выделять/освобождать вовсе.
Два нюанса:
1) т.к. я надеюсь утрамбовать всё в очень небольшой футпринт, хранение строк а-ля большой Лисп (когда строка представляется как список литералов) не подходит в виду неприемлемого расхода памяти - т.е. без классической динамической кучи всё равно не обойтись
2) заранее очень сложно понять, сколько же ячеек надо выделить.

Но всё равно такой способ экономичен и скуп, т.к. оверхед получается вообще околонулевой.

Идея мне нравится, надо поиграть с кодом.

Печальная калькуляция: во многих моих проектах (ирония - из личных проектов на ARM у меня пока только один) я использую старый добрый STM32F103, вот как тут:


В старших версиях этого почтенного чипа аж 64 килобайта оперативки. Допустим, под виртуальную машину выделим 32к памяти, то есть прямо половину (нужно ещё учесть, что под fatfs и стэк usb выделяются несколько килобайт, плюс х.з. что там ещё понадобится). Эти 32к превращаются в 4к ячеек (т.к. каждая ячейка занимает, как ни крути, 8 байт - даже если надо хранить всего лишь булево true или false). 4096 "атомов" в программе на Лиспе - много это или мало? Я не знаю.

uncommon lisp

Previous post Next post
Up