繁体   English   中英

数组 VS 指针

[英]Array VS Pointers

我有一个类似的课程:

class node{// case 1
    float points[maxCap][d];
    ...
}

我也可以这样做:

class node{// case 2
    float** points;

    node(){
        points = (float**)malloc(maxCap*sizeof(float*));
        if(points)
            for(int i=0; i<maxCapacity; i++)
                points[i] = (float*)malloc(d*sizeof(float));
        else{
            cout<<"Unable to get memory"<<endl;
            exit(1);
        }
    }
    ...
}

它们基本上是树中的节点。 我正在创建大约 500'000 到 1'000'000 个。

当我搜索一个点时,搜索算法中的每一件事都是相同的,情况 2 比情况 1 慢大约 0.2 秒(平均超过 3 次运行——尽管时间或多或少相同)所有 3 次运行)。 案例 1 的时间约为0.88s而案例 2 的时间约为1.07s 有人可以告诉我这里发生了什么吗? 这不应该大致相同吗?

不幸的是,您没有提供进行实际搜索的代码。 但是,假设搜索实际上需要访问points内/后面的数据,问题就很明显了:

  • 使用数组,数据直接存储在node对象中,并执行简单的指针运算来推导出points[a][b] 从内存中实际获取值只需要一次内存访问。

  • 使用指针方法,节点只包含存储地址数组的地址。 因此, points从内存中加载一个指针值, points[a]从内存中加载第二个指针值, points[a][b]最后将实际值加载到 CPU 中,准备进行比较。 这是三个内存访问,在数组情况下一个就足够了。

即使您的缓存和预取在减轻额外内存访问的影响方面做得很好,单个内存访问的性能也很容易超过三个。

考虑points[1][2]

后跟float** points;指针数量是原来的两倍float** points; float points[10][3]; .

作为草图,它是:

float* inner = *(points + 1);
float result = *(inner + 2);

float result = *(points + (3 * 2) + (1));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM