如何加速指针解除引用?

时间:2017-08-26 19:50:23

标签: c pointers dereference

这是我的代码:

#include <stdlib.h> //malloc

#define lineSize 16
#define columnSize 16
#define cellSize 16

int main()
{
    unsigned char*** tab;
    tab = malloc(sizeof(unsigned char**) * lineSize);
    for(unsigned int i = 0; i < lineSize; i++)
        tab[i] = malloc(sizeof(unsigned char*) * columnSize);
    for(unsigned int i = 0; i < lineSize; i++)
        for(unsigned int j = 0; j < columnSize; j++)
            tab[i][j] = malloc(sizeof(unsigned char) * cellSize);


    unsigned int line = 0;
    unsigned int column = 0;
    unsigned int cell = 0;

    unsigned char* ptr = &tab[line][column][cell];

    for(line = 0; line < lineSize; line++)
        for(column = 0; column < columnSize; column++)
            for(cell = 0; cell < cellSize; cell++)
                *ptr = ...;

    return 0;
}
  

此代码使用仅在执行时知道的值填充选项卡

在这种情况下没有太多问题,因为lineSize,columnSize和cellSize很小,问题是当cellSize变为100000+时,解除引用指针在时间方面变得昂贵, 这就是为什么我想用指针来避免解除引用。

问题是我不知道怎么做才能将指针更新为行,列或单元格更改。

感谢您的帮助,谢谢。

编辑:更多解释:

更大的lineSize,columnSize和cellSize,执行时间越长。这是预期的,但需要“很多时间”的是循环内部和循环内部的指针是一个解除16 * 16 * 100000次(When cellSize = 100000)的指针。

  

如果我是对的,解除引用就像是:

tab[2][5][3] = tab + 2*16*100000 + 5*100000 + 3;

做数学就好16 * 16 * 100000次。

为了避免数学,我想到了一个永久指向tab[line][column][cell]的指针,但我不知道怎么做,而不必每次cell递增时重新计算指针。

2 个答案:

答案 0 :(得分:3)

使用3-D数组时,除最后一个维度外,无法将指针移动到新位置。您可以沿ptr维度移动cell,但不能沿其他维度移动。

要做到这一点,只需添加距离:

ptr2 = ptr + dist

您在编辑中提到的计算与解除引用不同,将1-D数组解释为3-D数组时会使用它们。这将允许沿着所有维度移动。

您可以执行以下操作:

for(line = 0; line < lineSize; line++) {
    unsigned char** my_line = tab[line];
    for(column = 0; column < columnSize; column++)
        unsigned char* my_col = my_line[column];
        for(cell = 0; cell < cellSize; cell++)
            unsigned char data = my_col[cell];

答案 1 :(得分:-1)

您的代码中有UB。

tab[line][column][cell]; 

不适用于单独的malloc-ed值。它仅适用于连续所有表元素的连续内存块。你的块可能在记忆中的任何地方。