创建4D查找表

时间:2013-06-13 09:01:00

标签: c arrays performance lookup

我需要根据以下内容创建快速4D查找表: 1-它将接收4个输入变量(u,v,i,j),每个变量范围从0到15 2-查找表返回8位的预先计算值 如何在C语言的非常快速的代码中实现这个4D查找表

1 个答案:

答案 0 :(得分:2)

只需在堆栈上创建一个4维数组。 16 ^ 4字节的大小应该适合大多数平台上的堆栈,否则将其设置为静态或全局。它为编译器提供了有关布局的全部知识,它是一个众所周知且常用的语言结构,它应该很好地优化:

  uint8_t lookup[16][16][16][16];   // global table about 64KB 


  int main(int, char **)
  {
       ...

当然你可以制作一维数组uint8_t lookup[16*16*16*16]并乘以你的值lookup[u*16*16*16 + v*16*16 + i*16 + j]但是我非常怀疑你能否使这个性能比4-dim数组(编译器所做的那样)更高效。无论如何这种内部增殖)

由于您询问初始化,以下是如何初始化4-dim数组的示例。为简单起见它只是[4][4][4][4],所以你必须将它增加到16(16行16个16位,16个16位数。

uint8_t test[4][4][4][4]= {
       { // [0][x][y][z]
         { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, 
         { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, 
         { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, 
         { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }  },

       { // [1][x][y][z]
         { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, 
         { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, 
         { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, 
         { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }  },

       { // [2][x][y][z]
         { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, 
         { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, 
         { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, 
         { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }, { 3, 3, 3, 3 }  },                  

       { // [3][x][y][z]
         { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, 
         { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, 
         { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, 
         { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }, { 4, 4, 4, 4 }  }  
};