首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中,将X索引的内存复制到单个数组中的多个位置的最佳方法是什么?

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

Stack Overflow用户
提问于 2015-10-10 02:18:37
回答 1查看 82关注 0票数 0

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

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

假设您有一个数组:

代码语言:javascript
复制
int memory[100] = {0};

您有10个索引,它们在不同的位置镜像。例如,如果memory[0]被更改,索引0、10、20、30.应该更改为该值,或者如果更改了memory[3],则应镜像索引3、13、23、33。

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

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

如果是这样,那么使用memcpy是实现这一目标的最快/最有效的方法吗?或者某种迭代循环和指针数学会更好地提高效率吗?如何进行指针运算来计算要复制到的起始地址以及目的地?存储在内存数组中的开始地址的指针数组是否是处理此问题的最佳方法?

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

代码语言:javascript
复制
#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];
   }
}

我认为我可能在正确的轨道上,但这并不能满足我的所有要求,因为这具体地复制了第一个镜像的结果给其他人。如果写到任何其他镜像,它将被覆盖,而不是复制到其他镜像。

谢谢你的建议和建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-10 03:13:25

要指定每个镜像在memory数组中的起始位置,“指向‘内存’的指针数组可以工作”,

代码语言:javascript
复制
int *memory_mirror_starts[3] = {&memory[10], &memory[30], &memory[70]}; // (A)

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

代码语言:javascript
复制
int memory_mirror_starts[3] = { 10, 30, 70 }; // (B)

然后,为了确保对给定镜像的每一次写入都被复制到所有镜像中,而不必始终复制整个镜像,您可以在镜像中有一个poke函数来写入给定的索引(对于每种方法,(A)和(B))

代码语言:javascript
复制
void poke(int index, int value) {
   int j;
   for (j=0 ; j<NUMBER_OF_MIRRORS ; j++) 
      memory_mirror_starts[j][index] = value; // (A)
}

代码语言:javascript
复制
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)可能会更快一些(但优化者有发言权,最好同时测试这两种解决方案)

内联:

代码语言:javascript
复制
inline void poke(int index, int value) { ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33049574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档