Доступ к памяти через указатели считается более эффективным, чем доступ к памяти через массив. Я изучаю C, и выше указано в K & R. В частности, они говорят
Любая операция, которая может быть достигнута посредством подписи текста массива, также может быть выполнена с помощью указателей. Версия указателя в общем случае будет быстрее
Я снял следующий код с использованием Visual С++. (Mine - это процессор 686. Я отключил все оптимизации.)
int a[10], *p = a, temp;
void foo()
{
temp = a[0];
temp = *p;
}
К моему удивлению, я вижу, что доступ к памяти через указатель занимает 3 команды для двух, полученных путем доступа к памяти через массив. Ниже приведен соответствующий код.
; 5 : temp = a[0];
mov eax, DWORD PTR _a
mov DWORD PTR _temp, eax
; 6 : temp = *p;
mov eax, DWORD PTR _p
mov ecx, DWORD PTR [eax]
mov DWORD PTR _temp, ecx
Пожалуйста, помогите мне понять. Что мне здесь не хватает?
Как указывалось многими ответами и комментариями, я использовал константу времени компиляции, как индекс массива, что делает его, возможно, более легким для доступа через массив. Ниже приведен код сборки с переменной в качестве индекса. Теперь у меня есть равное количество инструкций для доступа через указатель и массивы. Мои более широкие вопросы по-прежнему сохраняются. Доступ к памяти через указатель не обеспечивает себя более эффективным.
; 7 : temp = a[i];
mov eax, DWORD PTR _i
mov ecx, DWORD PTR _a[eax*4]
mov DWORD PTR _temp, ecx
; 8 :
; 9 :
; 10 : temp = *p;
mov eax, DWORD PTR _p
mov ecx, DWORD PTR [eax]
mov DWORD PTR _temp, ecx