【问题标题】:is pointer accessing method faster than array indexing? [duplicate]指针访问方法比数组索引更快吗? [复制]
【发布时间】:2023-03-08 02:19:01
【问题描述】:

一些 C 书籍作者说通过指针访问数组值比通过数组索引更快。但这是真的吗? 这是我为理解这个概念而编写的两个程序。

main()
{
    int arr[100000],*ptr,c,i;
    ptr=arr;
    for(i=0;i<100000;i++)
      arr[i]=i;
    for(i=0;i<100000;i++)
      c = arr[i];
}

main()
{
    int arr[100000],*ptr,c,i;
    ptr=arr;
    for(i=0;i<100000;i++)
      *(ptr+i)=i;
    for(i=0;i<100000;i++)
      c = *(ptr+i);
}

当我使用time ./a.out 运行这两个程序时,第二个程序需要更多时间。这意味着使用指针比使用数组索引方法花费更多时间。 你能用这些简单的程序向我解释一下这是如何工作的吗?

【问题讨论】:

  • 这不是他们所说的指针访问的意思。关于时间安排,有这么几个项目你没有提到你占了(调试与发布,反编译的 asm 分析)。如果基准测试像time 流程监控器一样简单,我们都会成为高薪的统计学家。
  • 我认为你的意思是:stackoverflow.com/q/26241007/2455888
  • 在使用gcc.objdump -D a.out &gt; file 编译时为这两个程序添加“-g”标志。请记住为每个程序创建两个不同的文件。现在做 vimdiff file1 file2。比较差异,但我认为不会有任何差异。

标签: c arrays pointers


【解决方案1】:

您的“指针访问”不是预期的更快的方式。

你只是在做与索引相同的事情,记住在 C 中的表达式

A[i]

等价于

*(A + i)

所以,你的第二个循环只是手动表达数组索引,这是没有意义的。

应该是:

int main(void)
{
    int arr[100000], *ptr, *end, c;
    for(ptr = arr, end = arr + sizeof arr / sizeof *arr, i = 0;
        ptr != end; ++i)
    {
      *ptr++ = i;
    }
    for(ptr = arr; ptr != end; )
      c = *ptr++;
    return 0;
}

什么的。仍然不能保证这会更快,但至少它会尝试执行更少的操作。

【讨论】:

  • +1 高置信度,这更符合指针更快的声明的意图。
  • 这很有可能保存一个寄存器,这对 x86 这样的机器很有用,但对 x86-64 或类似机器来说并不是那么重要。
【解决方案2】:

这是一样的。运算符 [] 只是将索引添加到数组开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2018-07-04
    相关资源
    最近更新 更多