-
Notifications
You must be signed in to change notification settings - Fork 0
Generic
zuevmaxim edited this page Aug 4, 2020
·
2 revisions
В реализации специализации коллекций вся экономия памяти заключается в том, что данные лежат в массивах примитивных типов.
Идея: выделим хранение и работу с примитивным типом данных в отдельный интерфейс Storage<T>
, а реализацию контейнера можно сделать generic. Можно добиться того чтобы все промежуточные операции проводились только с примитивными типами.
Плюсы:
- не нужна runtime кодогенерация
- ключи и значения на самом деле независимы => выделив Storage в отдельную сущность можно иметь линейное от количества примитивных типов число классов
- в отличие от специализаций для HashMap, где требуется квадратичное количество
- производительность решения несильно ухудшается
Минусы:
- foreach - дорогая операция: требуется boxing примитивов
- из-за generic-ов входной параметр является Object => 1 лишний boxing
- виртуальные вызовы к Storage
- создание возможно только через специальную inline reified функцию
- требуется отдельная обработка для создания generic instance
- специальная обработка для вызовов из Java
TODO: здесь должен быть график