значения-структуры дублируются в нескольких хэшмапах, есть возможность реализовать это без оверхэда Rc+RefCell? Наверное только через unsafe?
Селфреф в целом сложный, без ансейфа и понимания нормально не делается
Я переписываю крупный проект с Си, там эта же структура у нас покрыта тестами и стабильно работала годами, так что в целом понимание есть :) Вопрос лишь как такое идеологически правильнее на Расте делать, если ансейф норм для такого, то окей
А где эти структуры лежат?
Вопрос по устройство? Обычные динамически аллоцированные структуры, указатели на которые лежат в нескольких вложенных хэштаблицах для индексации, и в соответствии с бизнес-логикой эти структуры меняются, индексы поддерживаются в валидном состоянии. Нечто вроде собственной БД для специфических задач
Обычно два пути для таких штук: если абсолютно уверены, что структурки лежат в Box'ах и никогда из них не вылазят и есть гарантии, что не освободится раньше времени, и нет многопоточности где нет гарантий одновременных изменений, то указатели, unsafe и погнали. Если же не паримся по поводу лишних дерефов и хотим без unsafe, то завести рядом с этими хешмапами арену (просто вектор плюс стек свободных индексов в нём) и вместо указателей использовать индексы в этом векторе. Профита оно не сильно даст, если логика плохая — то придётся паниковать, если вдруг не найдём элемента где он должен быть, но уже не сегфолтить. Ну и если есть &mut на эту ерундовину, то и RefCell не будет нужен. Оверхед получится возможно из-за Option (который по памяти можно потерять вроде, если структура "хорошая" и компилятор найдёт где там положить признак None), проверках на None, ну и походов через Vec (лишнее разыменовывание). Ничего сильно страшного в unsafe нет, если понятно что делаем, есть тесты и можем в голове уместить всё что может происходить)
Спасибо за инфу! Не слышал про паттерн арены, но на самом деле в Сишной реализации как раз используем подобный подход, но не для вспомогательных структур, коих много, их наверное в unsafe и уберём
Обсуждают сегодня