Эффективность: массивы против указателей
Доступ к памяти через указатели считается более эффективным, чем доступ к памяти через массив. Я изучаю C, и вышеизложенное указано в K & R. Конкретно они говорят
Любая операция, которая может быть достигнута путем подписки массива, также может быть выполнена с помощью указателей. Версия указателя в целом будет быстрее
Я разобрал следующий код, используя Visual C ++. (Мой - процессор 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