6

什么是串行复制?深拷贝和浅拷贝有区别吗?

根据Duff 的 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?

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

我们如何分配内存以to使循环有所作为?

4

3 回答 3

9

这种拷贝的重点是它不是写入普通内存,而是写入串行寄存器。

因此,每次写入寄存器to

通常,您甚至无法从这样的寄存器地址中读取,因此它们与普通的非常不同memory,最好将其视为恰好位于内存地址的特定硬件的接口。

于 2011-11-17T10:06:01.420 回答
4

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

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

于 2011-11-17T10:06:00.047 回答
2

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

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

如何访问这种“特殊”内存是非常特定于平台和实现的。有时这只是始终写入固定地址的问题 - 通常某些平台标头会提供#define或类似的 then 以使您在编译时可以使用该信息。有时您需要进行系统调用,告诉您您感兴趣的特定设备映射到的地址。

于 2011-11-17T10:07:27.687 回答