Anonymous
05/21/2021 (Fri) 08:20:04
No.10202
del
На самом деле я в последнее время не занимался Иколайси, много проектов и работы. Зато я придумал крутую вещь!
Поделал что-то там с битовыми индексами, ещё зачатки LDI-либс в код добавил (только я ещё не запушил на гитлаб)
Битовые индексы нужны не только, чтобы взаимодействовать с отдельными битами переменной (которые в лайси являются двоичными), но и для копирования памяти. А то приравнивание по идее должно иметь возможность перегрузки (чтобы копировать mem.vector, например) и без битовых индексов или сторонних функций (memcpy) не обойтись, когда надо именно скопировать (зачем?).
Насчёт той крутой вещи, так это умные линкинг указатели! (Не путать со смартпоинтерами сипипи).
Их суть в том, что это как бы много указателей, которые ссылаются на один объект, но если совершить del smartlinkingptr, то del над целевым объектом произойдёт, только если никакой другой смартптрлинкинг не ссылается на него.
То есть, например, у нас есть графический движок и мы хотим запилить инстансинг. Инстансинг разных вещей. Один меш на 2 объекта, один набор коллбеков на 2 объекта, один материал на 3 объекта, одна ротационная матрица на 10 объектов. Тут и нужны такие указатели.
То есть, например есть функция func (slp<mesh>,[...]) CreateMesh, мы её вызываем и получаем смартуказатель типа slp<mesh>. Потом берём структуру "объекта" (основная графическая единица графического движока) и приравнием его slp<mesh> name тот, что мы получили. Во время приравния вызывается функция перегрузки приравнивания и в их общий mem.vector указателей на самих себя увеличивается на единицу. При каждом del он будет уменьшаться, а если станет ноль, то совершится del над полем ptr, который содержит указатель на сам mesh.
Есть ещё одна ситуация, где такая структура потенциально полезная. Бывает, надо выделить какую-то переменную на стеке и её указатель приравнять в другую структуру, которая при удалении себя попробует удалить и эту переменную. А так как она на стеке, то произойдёт сегфолт или мемори коррупшион. С помощью такого смартпоинтера (но только если и целевая структура содержит в себе смартпоинтер) данные на стеке не удалятся, можно будет потом вручную очистить указатель и удалить безболезненно.
Для этого надо будет ещё ввести поддержку перегрузки оператор -> (reference)