什么是串行副本?为什么它这样实现?

时间:2011-11-17 09:59:25

标签: c++ memory-mapping

什么是序列副本?它与深拷贝和浅拷贝不同吗?

根据Duff's device下的wiki条目,它传统上实现为:

do {                //count > 0 assumed
    *to = *from++;  //Note that the 'to' pointer is NOT incremented
} while(--count > 0);

然后它会记下来,说

  

请注意,to不会递增,因为Duff正在复制到单个内存映射输出寄存器。

我真的不明白这个说明。

如果to指针没有递增,那么循环的重点是什么?为什么然后它被实现为:

*to = from[count-1]; //does it not do the same thing?

我怀疑它与 serial 副本的定义有关。

我们如何为to分配内存,以便循环会有所不同?

3 个答案:

答案 0 :(得分:9)

此类副本的要点是它不是普通存储器,而是串行寄存器。

因此,每次写入寄存器的地址(to)时,与寄存器相关的硬件将执行类似通过串行链路发送位的操作,或者将它们推送到队列中其他一些硬件要处理。

通常你甚至无法读取这样的寄存器地址,因此它们与普通memory非常不同,最好被认为是恰好位于存储器地址的特定硬件接口。

答案 1 :(得分:4)

http://en.wikipedia.org/wiki/Memory-mapped_I/O#Example

某些平台具有特殊地址,当您读取/写入时,系统将执行一些I / O.例如,to可以是在写入时控制说话者的地址。在那种情况下,循环将是例如能够播放声音,而*to = from[count-1];不会提供任何有用的输出。

答案 2 :(得分:2)

这里的to指针是“特殊的”。在某些硬件上,您可以通过写入特殊内存区域来访问IO端口。如果你想在IO端口上发送一个位模式,那么模式已经存在于内存中,这就是你要做的事情。

每次写入to都会导致IO端口的输出通常发生变化。这是为了迭代模式并将其写入“特殊”存储器。

如何访问这种“特殊”内存非常具有平台性和实现性。有时它只是一个总是写入固定地址的问题 - 通常一些平台头提供#define或类似的,然后在编译时为您提供这些信息。有时需要进行一次系统调用,告诉您对您感兴趣的特定设备所映射的地址。