Пройдя по косвенному указателю может быть намного медленнее из-за того, как работает современный процессор.Но это не имеет ничего общего с оперативной памятью.
Вместо этого на скорость влияют предсказание и кэш.
Прогнозирование легко, когда указатель не был изменен или когда он был изменен в предсказуемомпути (например, увеличение или уменьшение на четыре в цикле).Это позволяет ЦП существенно опережать фактическое выполнение кода, выяснить, каким будет значение указателя, и загрузить этот адрес в кэш.Предсказание становится невозможным, когда значение указателя создается сложным выражением, таким как хеш-функция.
Кэш вступает в игру, поскольку указатель может указывать на память, которая не находится в кеше, и его придется извлекать.Это сводится к минимуму, если предсказание работает, но если предсказание невозможно, то в худшем случае вы можете получить двойной эффект: указатель не находится в кеше, а цель указателя также не находится в кеше.В этом наихудшем случае ЦП будет зависать дважды.
Если указатель используется для указателя функции, в игру вступает предиктор ветвления ЦП.В виртуальных таблицах C ++ все значения функций являются постоянными, и предиктор делает это легко.ЦП будет иметь готовый код для запуска и в конвейере, когда выполнение пройдет через косвенный переход.Но, если это непредсказуемый указатель на функцию, влияние на производительность может быть значительным, потому что конвейер должен быть очищен, что тратит 20-40 циклов ЦП на каждый переход.