【问题标题】:What is serial copy? And why it is implemented like this?什么是串行复制?为什么它是这样实施的?
【发布时间】:2011-12-31 04:50:04
【问题描述】:

什么是序列副本?深拷贝和浅拷贝有区别吗?

根据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 copy的定义有关。

我们如何为to 分配内存以便循环产生一些影响?

【问题讨论】:

  • 可能是 FIFO BUFFER 的副本。例如。设备的硬件缓冲区。

标签: c++ memory-mapping


【解决方案1】:

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

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

【讨论】:

  • 我开始明白这一点。能否请您详细说明一下?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多