什么是串行复制?为什么要这样实现?

6

什么是串行复制?它与深拷贝和浅拷贝有什么不同吗?

根据Duff's device下的维基条目,传统实现方式如下:

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

然后它会做一个注释,内容如下:

请注意,由于Duff在复制到单个内存映射输出寄存器,因此未对to进行递增操作。

我不太理解这个注释的意思。

如果没有递增to指针,那么循环的意义是什么?为什么它被实现成这样:

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

我怀疑这与“串行”复制的定义有关。
我们如何为to分配内存,以便循环会产生一些差异?

可能是复制到FIFO缓冲区。例如,设备的硬件缓冲区。 - joy
3个回答

9
这种复制的目的在于它不是用于常规内存,而是用于串行寄存器。
因此,每次写入到寄存器地址(to)时,与寄存器相关的硬件将执行类似于通过串行连接发送比特或将它们推入队列以供其他硬件处理的操作。
通常,您甚至无法从这样的寄存器地址读取,因此它们非常不像普通的memory,最好将其视为指向位于内存地址处的特定硬件接口。

4
某些平台有特殊地址,当你从中读取/写入数据时,系统会执行一些 I/O 操作。例如,to 可能是一个地址,当你写入时,它就会控制扬声器。在这种情况下,循环可以播放声音,而 *to = from[count-1]; 将不会产生任何有用的输出。请参考链接了解更多: http://en.wikipedia.org/wiki/Memory-mapped_I/O#Example

我开始理解了。你能否详细说明一下? - Nawaz

2
这里的to指针是“特殊”的。在某些硬件上,您可以通过写入特殊的内存区域来访问IO端口。如果您想要通过IO端口发送一个位模式,而该模式已经存在于内存中,那么您将执行此类操作。
每次写入to都会导致IO端口的输出通常发生更改。这是为了迭代模式并将其写入“特殊”内存。
如何访问这种“特殊”内存非常依赖于平台和实现。有时只需始终写入固定地址 - 通常一些平台头文件提供#define或类似内容,然后在编译时使该信息可用于您。有时需要进行系统调用以告诉您感兴趣的特定设备映射到的地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接