Си не умеет хранить тип значения. Для него это просто байты в памяти, которые можно так, а можно эдак. Об этом уже миллион раз говорено, но я снова и снова буду это вспоминать
( Read more... )
какую именно? две (и более) разных "головы" списка могут иметь общий хвост. Любое количетсво списков может ссылаться на какой-либо конкретный атом. Не вижу тут проблем, кроме одной: сложность с удалением списка, надо различать ситуацию "больше никто не ссылается" и "кто-то ещё ссылается", не удаляя содержимое во втором случае. И тут надо уже Garbage collector делать.
вот ты пишешь - буду пользовать не указатель, а два указателя - не 32 бит а 64.
нельзя ли сэкономить на длине того из них, который на тип данных? договориться сам с собой, что описание типа данных не может находиться в любом из 2^32 адресов, а только лишь в любом из 2^20 адресов, начинающихся с 0x.... чего-то там.
ну то есть, хранить все описания типов в выделенной области памяти, и знать её начало (смещение). и допустим старшие 8-12-16 бит указателя на тип - использовать под флаги-таги. а для того, чтобы получить указатель на тип данных - использовать младшие биты, а старшие брать из постоянного адреса "начало области описания типов"
можно пойти дальше, и отвести часть флагов-тагов на выбор области, в которой описания хранить (её смещения). но будет тормозить. но можно будет в нескольких кусках адресного пространства хранить типы.
хмм.. вроде как страницы/сегменты в msdos, похожая механика
можно даже картировать типы - сделать лукап. еще и быстрее поди получится, чем манипуляции с битами.
область памяти для типов может потребоваться большая - но самих-то типов количество счётное и не очень большое. соответственно, из 32 бит указателя на тип памяти вообще будут использоваться ченибудь 10 (сомневаюсь, что средняя прога вылезает за 1000 типов данных)
Comments 19
Reply
Reply
Указателей на следующий понадобится столько, сколько таких списков
Reply
Reply
Reply
нельзя ли сэкономить на длине того из них, который на тип данных?
договориться сам с собой, что описание типа данных не может находиться в любом из 2^32 адресов, а только лишь в любом из 2^20 адресов, начинающихся с 0x.... чего-то там.
ну то есть, хранить все описания типов в выделенной области памяти, и знать её начало (смещение). и допустим старшие 8-12-16 бит указателя на тип - использовать под флаги-таги. а для того, чтобы получить указатель на тип данных - использовать младшие биты, а старшие брать из постоянного адреса "начало области описания типов"
можно пойти дальше, и отвести часть флагов-тагов на выбор области, в которой описания хранить (её смещения). но будет тормозить. но можно будет в нескольких кусках адресного пространства хранить типы.
хмм.. вроде как страницы/сегменты в msdos, похожая механика
Reply
область памяти для типов может потребоваться большая - но самих-то типов количество счётное и не очень большое. соответственно, из 32 бит указателя на тип памяти вообще будут использоваться ченибудь 10 (сомневаюсь, что средняя прога вылезает за 1000 типов данных)
Reply
Reply
я так п, твой каод различает, что перед ним - "указатель на тип" или что либо еще?
Reply
Leave a comment