通过指针进行内存访问比通过数组进行内存访问效率更高。我正在学习C语言,K&R中提到了上述内容。具体来说,他们说:
可以通过数组下标实现的任何操作也可以用指针完成。一般来说,指针版本会更快。
我使用Visual C++反汇编了以下代码。(我的处理器是686。我已禁用了所有优化。)
int a[10], *p = a, temp;
void foo()
{
temp = a[0];
temp = *p;
}
令我惊讶的是,通过指针进行内存访问需要3条指令,而通过数组访问内存只需要2条指令。以下是相应的代码。
; 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
a[i++]
与*p++
之间。我认为那时候与你的问题所问的是完全不同的。 - Johannes Schaub - litb