Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针访问方法是否比数组索引更快?_C_Arrays_Pointers - Fatal编程技术网

C 指针访问方法是否比数组索引更快?

C 指针访问方法是否比数组索引更快?,c,arrays,pointers,C,Arrays,Pointers,一些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; p

一些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);
}
main()
{
国际农业资源[100000],*ptr,c,i;
ptr=arr;

对于(i=0;i这是相同的。运算符[]只是将索引添加到数组开始。

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

你只是在做与索引相同的事情,记住在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;
}

或者别的什么。仍然不能保证这会更快,但至少它会尝试做更少的操作。

这不是指针访问的意思。关于时间安排,有很多项目你都没有提到(调试vs发布,反编译asm分析)。如果基准测试像
时间
过程监视器那样简单,我们都会成为高薪的统计学家。我想你的意思是:在使用
gcc
编译时,为这两个程序都添加“
-g
”标志。记住为每个程序创建两个不同的文件。现在执行vimdiff file1 file2.Com减少差异,但我认为不会有任何差异。+1高置信度这更符合指针更快声明的意图。这有很好的机会保存一个寄存器,这对x86这样的机器很好,但对x86-64或类似机器来说并不那么重要。