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