在C中,将X索引的内存复制到单个数组中的多个位置的最佳方法是什么?
要解决的问题是CPU仿真器的模拟内存。原始硬件有这种类型的内存镜像,我试图通过代码复制它。
假设您有一个数组:
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是实现这一目标的最快/最有效的方法吗?或者某种迭代循环和指针数学会更好地提高效率吗?如何进行指针运算来计算要复制到的起始地址以及目的地?存储在内存数组中的开始地址的指针数组是否是处理此问题的最佳方法?
可能是这样的(这可能不会编译,它只是我的想法的伪代码):
#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];
}
}我认为我可能在正确的轨道上,但这并不能满足我的所有要求,因为这具体地复制了第一个镜像的结果给其他人。如果写到任何其他镜像,它将被覆盖,而不是复制到其他镜像。
谢谢你的建议和建议。
发布于 2015-10-10 03:13:25
要指定每个镜像在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函数很小,代码不应该变大。*(*(memory_mirror_starts + j) + index) = value*(memory + *(memory_mirror_starts + j) + index) = value内联:
inline void poke(int index, int value) { ...https://stackoverflow.com/questions/33049574
复制相似问题