Должен ли int получить доступ к содержимому массива примитивов для лучшей производительности?
Вот пример
int[] arr = new arr[]{1,2,3,4,5};
Длина массива всего 5 элементов, поэтому индекс должен быть не целым, а коротким или байтовым, что позволит сэкономить бесполезное 3-байтовое распределение памяти, если вместо байта используется байт. Конечно, если бы я только знал, что массив не переполнится размером 255.
byte index = 1;
int value = arr[index];
Но работает ли это так хорошо, как кажется?
Я беспокоюсь о том, как это выполняется на более низком уровне, преобразуется ли индекс в int или другие операции, которые фактически замедляют весь процесс, а не оптимизируют его.
В C и C ++ arr [index] формально эквивалентен * (arr + index). Ваши опасения по поводу приведения должны отвечать с точки зрения более простого вопроса о том, что будет делать машина, когда ей нужно добавить добавление целочисленного смещения к указателю.
я считать Можно с уверенностью сказать, что на большинстве современных машин, когда вы добавляете «байт» к указателю, он будет использовать ту же инструкцию, что и при добавлении 32-разрядного целого числа к указателю. И действительно, он по-прежнему будет представлять этот байт, используя размер машинного слова, дополненный неиспользованным пробелом. Так что это не собирается делать с помощью массив быстрее.
Ваша оптимизация может иметь значение, если вам нужно хранить миллионы этих индексов в таблице, а затем использование байта вместо int будет использовать в 4 раза меньше памяти и займет меньше времени для перемещения этой памяти. Если массив, который вы индексируете, огромен, и индекс должен быть больше, чем сторона машинного слова, то это другое соображение. Но я думаю, что можно с уверенностью сказать, что в большинстве нормальных ситуаций такая оптимизация не имеет смысла, и size_t, вероятно, является наиболее подходящим универсальным типом для индексов массива, при всех равных условиях (поскольку он точно соответствует размеру машинного слова на большинство архитектур).
Индекс приводится к int или другим операциям, которые фактически замедляют весь процесс, а не оптимизируют его
Нет, но
это сэкономит бесполезное 3-байтовое распределение памяти
Вы ничего не получаете, экономя 3 байта.
Только если вы храните огромный массив этих индексов, то количество места, которое вы бы сэкономили, может сделать его достойным вложением.
В противном случае придерживаться равнины int
Это родной размер слова процессора и, следовательно, самый быстрый.