c - 是什么让指针比数组更快?

标签 c

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

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

我不知道指针也可以以数组形式访问。我曾经使用 * 进行指针操作 我将 a[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

现在我想知道:哪个操作更快?我读到使用指针的操作速度更快,这就是为什么 C 在快速执行方面保持领先地位并且没有其他语言可以超越它的快速性。

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

1) *(p+0) *(Value at address) 使技巧或

2) p[0]

因为我们使用

 *(a+1) or *(p+1) both are same 
  a[1] or p[1] both are same 

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

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

最佳答案

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

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

int
PointerRef(int* array, int index)
{
    return *(array + index);
}

(清理后)看起来像:

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

(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

关于c - 是什么让指针比数组更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7261010/

相关文章:

c++ - 如何在Processing中制作旋转摄像机?

c - MPIR 编码错误

c - 关于在C中以特定格式打印数字的问题

c - 如何指定要在printf中打印出来的char[]的长度

c++ - extern C 的 undefined reference

c - 为什么 char * 不能收到正确的值?

C - 对 void 类型进行哈希处理?

使用 char 指针复制 C 结构

c - 递归反向链接列表

c - 我的代码有什么问题? argv[1] 是什么?