LINUX.ORG.RU

История изменений

Исправление kvpfs, (текущая версия) :

К слову - зашёл на гитхаб и сразу нашёл однопоточный шаред_птр https://github.com/SRombauts/shared_ptr.

В расте для однопоточной умной ссылки (Rc) не используются атомики. При муве счетчик не затрагивается (там просто делается memmove заголовка объекта). При деструкторе мы точно (для строгой ссылки) знаем, что счетчик нужно уменьшить, чтобы проверить, что ссылка не опустела, т.е. инлайнить в вызываемый код никакую проверку на nullptr точно не надо (см. примечание внизу). В разделяемой ячейке находится сам ссылаемый объект, а не указатель на него, что уменьшает уровень косвенности на единицу при обращении - выше локальность кеша, меньше обращений к памяти.

Я не проверял производительность (не интересно было копаться в расте), но звучит это всё как какой-то лютый костыль через задницу - ввиду отсутствия указателей приходится копировать объекты «по честному», а не ходить по ссылкам. В случае каких-то скаляров простых это может и круто всё и косвенность действительно меньше, но вот очень скоро (когда данные станут размеров в несколько интов) такой подход начнёт сливать. В общем красиво на каких-то игрушечных примерах - мол смотрите, у меня здесь шаред_птр с одним интом внутри и я рву плюсы.

Да даже на скалярах сомневаюсь - всё равно надо сходить куда-то и скопировать. Да и всякие оптимизации с накоплением в регистрах никто не отменял, т.е. если цикл какой-то, то плюсовому хелоу ворлду не нужно 100500 раз ходить куда-то.

Исходная версия kvpfs, :

К слову - зашёл на гитхаб и сразу нашёл однопоточный шаред_птр https://github.com/SRombauts/shared_ptr.

В расте для однопоточной умной ссылки (Rc) не используются атомики. При муве счетчик не затрагивается (там просто делается memmove заголовка объекта). При деструкторе мы точно (для строгой ссылки) знаем, что счетчик нужно уменьшить, чтобы проверить, что ссылка не опустела, т.е. инлайнить в вызываемый код никакую проверку на nullptr точно не надо (см. примечание внизу). В разделяемой ячейке находится сам ссылаемый объект, а не указатель на него, что уменьшает уровень косвенности на единицу при обращении - выше локальность кеша, меньше обращений к памяти.

Я не проверял производительность (не интересно было копаться в расте), но звучит это всё как какой-то лютый костыль через задницу - ввиду отсутствия указателей приходится копировать объекты «по честному», а не ходить по ссылкам. В случае каких-то скаляров простых это может и круто всё и косвенность действительно меньше, но вот очень скоро (когда данные станут размеров в несколько интов) такой подход начнёт сливать. В общем красиво на каких-то игрушечных примерах - мол смотрите, у меня здесь шаред_птр с одним интом внутри и я рву плюсы.