C 如何优化重复添加
基本上,C 如何优化重复添加,c,C,基本上,array1的索引从0到255递增1 但是array2的索引固定在0到7之间。所以我想优化这个多重加法。如何对此进行优化?使用指针 #define NULL 0 int main() { int *array1=NULL,*array2=NULL; int x =add(array1[0],array2[0]); int y =add(array1[1],array2[7]); int x =add(array1[2],array2[3]);
array1
的索引从0到255递增1
但是array2
的索引固定在0到7之间。所以我想优化这个多重加法。如何对此进行优化?使用指针
#define NULL 0
int main()
{
int *array1=NULL,*array2=NULL;
int x =add(array1[0],array2[0]);
int y =add(array1[1],array2[7]);
int x =add(array1[2],array2[3]);
int y =add(array1[3],array2[4]);
int x =add(array1[4],array2[6]);
int y =add(array1[5],array2[1]);
int x =add(array1[6],array2[5]);
int y =add(array1[7],array2[2]);
................
................
int x =add(array1[252],array2[0]);
int y =add(array1[253],array2[7]);
int x =add(array1[254],array2[3]);
int y =add(array1[255],array2[4]);
}
但请记住
在优化之前,请测量并确保需要优化对阵列的访问
优化措施后,确保优化效果。第一步:
int *array1 = NULL, *array2 = NULL;
int *ptr1 = array1;
int x = add(*ptr1++, array2[0]);
int y = add(*ptr1++, array2[7]);
int x = add(*ptr1++, array2[3]);
int y = add(*ptr1++, array2[4]);
int x = add(*ptr1++, array2[6]);
int y = add(*ptr1++, array2[1]);
int x = add(*ptr1++, array2[5]);
int y = add(*ptr1++, array2[2]);
................
................
int x = add(*ptr1++, array2[0]);
int y = add(*ptr1++, array2[7]);
int x = add(*ptr1++, array2[3]);
int y = add(*ptr1++, array2[4]);
for(int i=0;i<256;i+=8){
x=加(数组1[i],数组2[0]);
y=加(数组1[i+1],数组2[7]);
...
}
你能做的就是
for (int i = 0; i < 256; i+=8) {
x = add(array1[i], array2[0]);
y = add(array1[i+1], array2[7]);
...
}
intj=0,顺序[]={0,7,3,4,6,1,5,2};
对于(int i=0;i y)
{
*阵列3[0]=x;
*阵列4[CurrentTre+0]=0;
}
其他的
{
*阵列3[i]=y;
*阵列4[CurrentTre+0]=1;
}
..........
..........
如果(x>y)
{
*阵列3[0]=x;
*阵列4[CurrentTre+127]=254;
}
其他的
{
*阵列3[i]=y;
*阵列4[CurrentTre+127]=255;
}
/////////////
我的方法是这样的
如果(x>y)
{
*阵列3[i]=x;
*array4[int CurrentTre+i]=int number[i]您的代码没有真正意义,因为您似乎正在重新定义x
和y
。是的,删除main()
中除最后两行之外的所有前几行。完成。访问数组[1]将crash@PeterMiehle:如果UB保证会崩溃,那会更好。但事实并非如此。请注意,数组_[0]已经是UB btw(取消引用空指针)。y=array1[i+1]
和for(…,i+=2)
@PeterMiehle我也把它修好了,但因为数字是偶数,所以你的方式是偶数better@Lundin好的,但是对于y,你不能简单地使用index2+1作为第二个数组的索引,你需要从顺序中取回它。为什么i增加2?@sam示例a beging i=0,对于x,我们使用0,但是在同一个循环中,对于y,我们根据需要放置i+1,现在如果我们只增加1 x将使用1,但我们需要它是2,因此我们增加2,因为使用数组[i+1]不会增加i。
int j = 0,order[] = {0,7,3,4,6,1,5,2};
for(int i = 0;i <256; i +=2)
{
int x =add(array1[i],array2[order[j%8]]);
j++;
int y =add(array1[i+1],array2[order[j%8]]);
j++;
}
int j = 0,order[] = {0,7,3,4,6,1,5,2};
for(int i = 0;i <256; i ++)
{
int x =add(array1[i],array2[order[j%8]]);
j++;
i++;
if(i>=256) break; //Improves it if you have non even condition
int y =add(array1[i],array2[order[j%8]]);
j++;
}
CurrentTre=256;
if (x > y)
{
*array3[0]= x;
*array4[CurrentTre +0] = 0;
}
else
{
*array3[i] = y;
*array4[CurrentTre + 0] = 1;
}
..........
..........
if (x > y)
{
*array3[0]= x;
*array4[CurrentTre +127] = 254;
}
else
{
*array3[i] = y;
*array4[CurrentTre + 127] = 255;
}
/////////////
my approach is this way
if (x > y)
{
*array3[i]= x;
*array4[int CurrentTre +i] = int number[i]<<1;
}
else
{
array3[i] = y;
array4[int CurrentTre + i] = int number[i]<<1|1;
}
} //end function main
uint32 even_number[255] ={0};
uint32 loop_index1=0;
uint32 loop_index2=0;
uint16 order[256]={0,7,3,4,6,1,5,2,4,3,7,0,1,6,2,5,7,0,4,3,2,5,1,6,3,4,0
,7,6,1,5,2,4,3,7,0,1,6,2,5,0,7,3,4,5,2,6,1,3,4,0,7,6,1,5,2,7,0,4,3,2,5
,1,6,5,2,6,1,0,7,3,4,1,6,2,5,4,3,7,0,2,5,1,6,7,0,4,3,6,1,5,2,3,4,0,7,1
,6,2,5,4,3,7,0,5,2,6,1,0,7,3,4,6,1,5,2,3,4,0,7,2,5,1,6,7,0,4,3,3,4,0,7
,6,1,5,2,7,0,4,3,2,5,1,6,4,3,7,0,1,6,2,5,0,7,3,4,5,2,6,1,7,0,4,3,2,5,1
,6,3,4,0,7,6,1,5,2,0,7,3,4,5,2,6,1,4,3,7,0,1,6,2,5,6,1,5,2,3,4,0,7,2,5
,1,6,7,0,4,3,1,6,2,5,4,3,7,0,5,2,6,1,0,7,3,4,2,5,1,6,7,0,4,3,6,1,5,2,3
,4,0,7,5,2,6,1,0,7,3,4,1,6,2,5,4,3,7,0}; //all 256 values
for(loop_index1;loop_index1<256;loop_index1++)
{
m0= (CurrentState[loop_index1]+Branch[order[loop_index2]]);
loop_index2++;
loop_index1++;
if(loop_index1>=256)
break;
m1= (CurrentState[loop_index1]+Branch[order[loop_index2]]);
loop_index2++;
if (mo > m1)
{
NextState[loop_index1]= m0;
SurvivorState[CurrentTrellis + loop_index1] =
even_number[loop_index1]<<1;
}
else
{
NextState[loop_index1] = StateMetric1;
SurvivorState[CurrentTrellis + loop_index1] =
even_number[loop_index1<<1|1;
}
}