如何使用memcpy使用双指针从连续位置访问值

如何使用memcpy使用双指针从连续位置访问值,c,pointers,C,Pointers,正如我们在下面的插图中看到的 有两个内存块低(250 x无符号整数)和高(250 x无符号整数) 高位块包含值,低位块包含地址 所以我创建了一个从低块到高块的指针数组 并使用另一个指针(**OutputOffsetAddress)访问该指针数组,该指针穿过低位块,以区分地址并获取值 所以,如果我想直接从地址读取一个值(没有所有指针),我就这样做 Read(unsigned offset, void *buffer, unsigned size) { memcpy(buffer, memBa

正如我们在下面的插图中看到的

有两个内存块低(250 x无符号整数)和高(250 x无符号整数) 高位块包含值,低位块包含地址

所以我创建了一个从低块到高块的指针数组 并使用另一个指针(**OutputOffsetAddress)访问该指针数组,该指针穿过低位块,以区分地址并获取值

所以,如果我想直接从地址读取一个值(没有所有指针),我就这样做

Read(unsigned offset, void *buffer, unsigned size)
{
  memcpy(buffer, memBase + offset, size);
}
但是现在我有了一个双指针,我想尊重它并得到它的值

方法之一是

unsigned int a[250];
for (int x = 0; x < 250; x++)
{
    a[x] = **outputOffsetAddress;
    outputOffsetAddress++;
}
无符号整数a[250];
对于(int x=0;x<250;x++)
{
a[x]=**输出设置地址;
outputOffsetAddress++;
}
但我有10毫秒的时间限制来读取所有250个位置。

上述解决方案有效吗
如果不是的话,我如何使用
memcpy

10ms来做同样的事情似乎有足够的时间来读取250个内存位置。你在哪个平台上?a[x]=*outputOffsetAddress[x]怎么样?@th33lf:即500个位置,而不是250个;每次读取数据都需要指针读取。您读取的操作是“聚集”操作,这一术语通常与分散-聚集操作成对出现。一般来说,这对于硬件来说是一个糟糕的操作,因为处理器无法预测下一次读取的位置(因为它是由存储指针的内容控制的,处理器不知道该指针的值,而不是通过处理器可以预测的连续增加地址),所以它无法执行任何预取。收集操作也可能对缓存非常不利。但是,您描述的操作很小……在许多系统中,所有数据都可以放在缓存中。对于(intx=0;x<250;++x)a[x]=*outputOffsetAddress[x]。(如果指针有某种模式,可能会被利用以获得一些改进。)如果数据已经完全在缓存中,一些处理器将以最佳方式执行该代码,并且可能没有可用的改进。如果数据不在缓存中,则可以通过预取500个字来提高性能,从而有效地加载这些字。