Большинство машин имеют инструкцию загрузки или режим адресации, который может включать небольшое постоянное смещение без дополнительных затрат.
На x86, [reg]
против [reg + disp8]
стоит 1 дополнительный байт для 8-битного смещение части режима адресации. На RIS C -подобных машинах, например, ARM, инструкции фиксированной ширины означают, что в инструкциях загрузки / сохранения всегда есть несколько бит для смещения (которые могут быть просто равны нулю для доступа к первому элементу при указателе на начало объекта ).
Сгруппируйте самые горячие элементы в начале класса, предпочтительно отсортировав их по размеру, чтобы избежать пробелов для заполнения ( Как организовать элементы в структуре так, чтобы тратить на них меньше места выравнивание? ) Надеюсь, все горячие элементы будут в одной строке кэша . (Если ваш класс / структура расширяется до 2-й строки кэша, мы надеемся, что большую часть времени в кеше должна оставаться только первая строка, что сокращает объем вашего рабочего набора.)
Если член не является на той же странице , что и в начале объекта, оптимизация поиска указателей в семействе Sandybridge может вызвать дополнительную задержку, если this
также был загружен из памяти. Существует ли штраф, когда base + offset находится на странице, отличной от базовой? Обычно это уменьшает задержку использования нагрузки L1d с 5 до 4 циклов для режимов адресации, таких как [rdi + 0..2047]
, оптимистично используя только регистр значение в качестве входа в TLB, но нужно повторить попытку, если он угадал. (Не конвейерный грипп sh, просто повторная попытка этой загрузки без ярлыка.)
Обратите внимание, что указатели функций в основном зависят от предсказания ветвления, чтобы быть эффективными с доступом задержка имеет значение только для проверки прогноза (и запускает восстановление ветвления, если оно было неверным). т. е. спекулятивное выполнение + предсказание ветвлений скрывает зависимости управления задержкой в процессорах с неработающим exe c.