Слишком умная оптимизация? Не, это я сам себя перехитрил.

Jan 02, 2016 00:59

Си не умеет хранить тип значения. Для него это просто байты в памяти, которые можно так, а можно эдак. Об этом уже миллион раз говорено, но я снова и снова буду это вспоминать ( Read more... )

uncommon lisp

Leave a comment

Comments 19

psilogic January 2 2016, 01:26:29 UTC
а если надо положить ячейку в 3 разных списка?

Reply

kincajou January 2 2016, 02:01:54 UTC
какую именно? две (и более) разных "головы" списка могут иметь общий хвост. Любое количетсво списков может ссылаться на какой-либо конкретный атом. Не вижу тут проблем, кроме одной: сложность с удалением списка, надо различать ситуацию "больше никто не ссылается" и "кто-то ещё ссылается", не удаляя содержимое во втором случае. И тут надо уже Garbage collector делать.

Reply

psilogic January 2 2016, 07:36:58 UTC
[ Любое количетсво списков может ссылаться на какой-либо конкретный атом. ]

Указателей на следующий понадобится столько, сколько таких списков

Reply

kincajou January 2 2016, 13:05:11 UTC
Нет. И это в любой системе, реализующей связные списки - хвост может быть только один. Голов - сколько угодно.

Reply


metaclass January 2 2016, 08:24:34 UTC
Отличный баг, одобряю :)

Reply


tomarcafe January 2 2016, 10:34:18 UTC
вот ты пишешь - буду пользовать не указатель, а два указателя - не 32 бит а 64.

нельзя ли сэкономить на длине того из них, который на тип данных?
договориться сам с собой, что описание типа данных не может находиться в любом из 2^32 адресов, а только лишь в любом из 2^20 адресов, начинающихся с 0x.... чего-то там.

ну то есть, хранить все описания типов в выделенной области памяти, и знать её начало (смещение). и допустим старшие 8-12-16 бит указателя на тип - использовать под флаги-таги. а для того, чтобы получить указатель на тип данных - использовать младшие биты, а старшие брать из постоянного адреса "начало области описания типов"

можно пойти дальше, и отвести часть флагов-тагов на выбор области, в которой описания хранить (её смещения). но будет тормозить. но можно будет в нескольких кусках адресного пространства хранить типы.

хмм.. вроде как страницы/сегменты в msdos, похожая механика

Reply

tomarcafe January 2 2016, 10:47:30 UTC
можно даже картировать типы - сделать лукап. еще и быстрее поди получится, чем манипуляции с битами.

область памяти для типов может потребоваться большая - но самих-то типов количество счётное и не очень большое. соответственно, из 32 бит указателя на тип памяти вообще будут использоваться ченибудь 10 (сомневаюсь, что средняя прога вылезает за 1000 типов данных)

Reply

kincajou January 2 2016, 15:05:10 UTC
...но становится неудобно хранить 32-битные целые.

Reply

tomarcafe January 3 2016, 14:46:56 UTC
почему?

я так п, твой каод различает, что перед ним - "указатель на тип" или что либо еще?

Reply


Leave a comment

Up