将X索引的内存复制到C中单个数组中的多个位置的最佳方法是什么?

时间:2015-10-10 02:18:38

标签: c arrays pointers

将X索引的内存复制到C中单个数组中的多个位置的最佳方法是什么?

试图解决的问题是CPU仿真器的仿真内存。原始硬件具有这种类型的内存镜像,我试图通过代码复制它。

假设你有一个数组:

int memory[100] = {0};

你有10个镜像在不同的位置镜像。例如,如果更改memory[0],则索引0,10,20,30 ......应更改为该值,或者如果更改memory[3],则应镜像索引3,13,23,33。 / p>

同样,如果任何镜像位置被更改,则所有其他镜像位置都应该反映这一点,例如如果索引23被更改,则3,13,23,33 ...等应该反映这一点。

另一个要求是指定镜像位置的开始和结束位置的方法。例如,索引10-19可以在索引30-39处镜像,然后再在70-79处镜像,在镜像索引的段之间留下未修改的空间。

如果使用memcpy是最快/最有效的方法,或者某种迭代循环和指针数学会更好地提高效率吗?如何计算指针数学来计算要复制到的起始地址以及目的地?保存存储器阵列中的起始地址的指针数组是否是处理此问题的最佳方法?

可能有点像(这可能不会编译它只是我的想法的伪代码):

#define NUMBER_OF_MIRRORS 3
#define LENGTH_OF_MIRRORS 10
int  memory[100]             = {0};
int *memory_mirror_starts[3] = {&memory[10], &memory[30], &memory[70]};

// When memory needs to be mirrored
for(int i = 0; i < NUMBER_OF_MIRRORS; i++) {
   for(int n = 0; n < LENGTH_OF_MIRRORS; n++) {
       memory_mirror_starts[i][n] = memory_mirror_starts[0][n];
   }
}

我想我可能走在正确的轨道上,但这并不能满足我的所有要求,因为这会特别将第一张镜子的结果复制到其他镜像。如果写入任何其他镜像,则会被覆盖而不是复制到其他镜像。

感谢您的任何提示和建议。

1 个答案:

答案 0 :(得分:2)

要指定每个镜像在memory数组中的起始位置,“指向'内存'的指针数组”,

int *memory_mirror_starts[3] = {&memory[10], &memory[30], &memory[70]}; // (A)

或者您可以简单地给出每个偏移量:

int memory_mirror_starts[3] = { 10, 30, 70 }; // (B)

然后确保对给定镜像的每次写入确实被复制到所有镜像,而不是一直复制整个镜像,你可以使用poke函数在镜像中的给定索引处写入(对于每个镜像)方法,(A)和(B))

void poke(int index, int value) {
   int j;
   for (j=0 ; j<NUMBER_OF_MIRRORS ; j++) 
      memory_mirror_starts[j][index] = value; // (A)
}

void poke(int index, int value) {
   int j;
   for (j=0 ; j<NUMBER_OF_MIRRORS ; j++) 
      memory[memory_mirror_starts[j] + index] = value; // (B)
}

具有集中写访问权限的功能可以为开发人员隐藏镜像复杂性,并确保所有镜像确实正确更新。

注意index可以检查为>=0< LENGTH_OF_MIRRORS

表现明智,

  • inline添加到函数声明中将使用函数代码更改函数调用,从而保存调用。 poke函数很小,代码不应该变大。

  • (A)基本上*(*(memory_mirror_starts + j) + index) = value

  • (B)基本上*(memory + *(memory_mirror_starts + j) + index) = value
  • 所以(A)可能会更快一点,(但优化者有自己的发言权,而且测试两种解决方案更好)

内联:

inline void poke(int index, int value) { ...