【发布时间】:2018-02-04 13:12:00
【问题描述】:
这是我的代码:
#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 时重新计算指针。
【问题讨论】:
-
为什么不将地址的确定(即写入指针变量)移到循环中?如果您通过该指针访问多次,则可以节省时间。如果你不是,那么引入指针是朝错误方向迈出的一步。只需直接访问
tab[line][column][cell],一次或两次。 -
@Yunnosch 将指针地址的确定直接移入循环将无济于事。它将执行与我仅使用
tab[line][column][cell]完全相同的计算量 -
这仅适用于单次访问。实际上,首先存储指针的成本更高。正如我所说,这是朝着错误方向迈出的一步。
-
您可以采取冒险的方式,即通过差异增加指针(根据您的适当数学)。但是,有龙。
-
@Yunnosch 我会测试一下
标签: c pointers dereference