什么使指针比数组更快?

nik*_*iko 9 c

我在Google上搜索并找到了以下指针语法

  void main()
 {
  char a[10]="helloworld";
  char *p=a;
  printf("%c",p[0]);
 }
Run Code Online (Sandbox Code Playgroud)

我不知道Pointers也可以以数组形式访问.我曾经使用*作为指针操作我使用[0]表示数组,而*p表示指针操作,这就是为什么我不知道其他两件事.从上面可以看出,我们可以通过以下任何一种方式访问​​数组的第二个元素

  printf("%C",a[1]);   \\ this is the array
  printf("%c",*(a+1));  \\ this is the array using *
  printf("%c", p[1]);     \\ using the pointer 
  printf("%C",*(p+1));    \\ using the pointer
Run Code Online (Sandbox Code Playgroud)

现在我想知道:哪个操作更快?我读到使用指针的操作更快,这就是为什么C保持在顶部以便快速执行并且没有其他语言能够超越其坚固性的原因.

现在真正的问题是:什么使指针操作更快?

1)*(p + 0)*(地址的值)制作技巧或

2)p [0]

因为我们使用

 *(a+1) or *(p+1) both are same 
  a[1] or p[1] both are same 
Run Code Online (Sandbox Code Playgroud)

当一个普通数组可以用作*(a + 1)(在地址上使用*值)时,就像指针一样.为什么我们使用指针来加快操作?当两者具有相同的语法时,正常数组和指针在这些语法中使用*时为什么指针更快?

但伙计们请告诉我为什么我们使用指针?我的教授告诉我指针更快,因为他们指向地址而不是应该在该位置搜索变量.

Dir*_*irk 11

我实际上并不希望*(ptr + offset)比它更快ptr[offset].实际上,在我的机器上,以下函数被编译成完全相同的汇编代码:

int
ArrayRef(int* array, int index)
{
    return array[index];
}

int
PointerRef(int* array, int index)
{
    return *(array + index);
}
Run Code Online (Sandbox Code Playgroud)

哪个(清理过)看起来像:

ArrayRef:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    %rdi, -8(%rbp)
    movl    %esi, -12(%rbp)
    movl    -12(%rbp), %eax
    cltq
    salq    $2, %rax
    addq    -8(%rbp), %rax
    movl    (%rax), %eax
    leave
    ret

PointerRef:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    %rdi, -8(%rbp)
    movl    %esi, -12(%rbp)
    movl    -12(%rbp), %eax
    cltq
    salq    $2, %rax
    addq    -8(%rbp), %rax
    movl    (%rax), %eax
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

(gcc 4.5.0,x86_64,没有优化).或者-O3

ArrayRef:
    movslq  %esi, %rsi
    movl    (%rdi,%rsi,4), %eax
    ret

PointerRef:
    movslq  %esi, %rsi
    movl    (%rdi,%rsi,4), %eax
    ret
Run Code Online (Sandbox Code Playgroud)