0

我有一个关于优化的练习。我需要优化一个旋转 45 度的程序。我知道使用指针访问数组更有效,所以我尝试了下面的更改 - 原始代码:

RGB* nrgb = (RGB *)malloc(imgSizeXY*3);//3=sizeof(RGB)
//...
for (i=imgSizeY-1; i>=0; --i)
    {
        for (j=imgSizeX-1; j>=0; --j)
        {
                //...
                int y=(i*imgSizeX+j);
                nrgb[y].r = *imgInd; //*imgInd computed earlier

变化:

    RGB* nrgb = (RGB *)malloc(imgSizeXY*3);//3=sizeof(RGB)
    RGB* rgbInd = nrgb+imgSizeXY-1;
    for (i=imgSizeY-1; i>=0; --i)
    {
        for (j=imgSizeX-1; j>=0; --j)
        {
              rgbInd->r=*imgInd;
              --rgbInd;

但是当使用指针时,程序会产生错误的输出。我已经盯着它看了好几个小时,仍然不知道为什么。有任何想法吗?非常感谢!

4

2 回答 2

2

通过指针访问数组元素和通过索引访问没有区别。你可以看到,如果产生汇编代码。索引记法更简单。

于 2013-01-12T08:09:47.860 回答
0

L1 高速缓存命中比 L2 高速缓存命中快一个数量级,而 L2 高速缓存命中本身比主存储器访问快一个数量级。请参阅每个计算机科学家都应该知道的数字。对于图像操作,您预计您将不得不进行大量的内存读取和写入,因此您应该期望在优化代码时主要关注缓存效率。

所以集中精力寻找更有效地使用缓存的方法,不要太担心你的编译器没有优化简单的指针算法。

于 2013-01-12T10:22:19.927 回答