Что такое серийная копия? И почему это реализовано так? - PullRequest
6 голосов
/ 17 ноября 2011

Что такое серийный копия? Отличается ли он от глубокого и мелкого копирования?

Согласно записи вики под Устройство Даффа , оно традиционно реализуется как:

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

И тогда он делает заметку, говоря:

Обратите внимание, что to не увеличивается, поскольку Дафф копировал в один отображенный в память выходной регистр.

Я не совсем понял эту записку.

Если указатель to не увеличивается, то в чем смысл цикла? Почему тогда это реализовано так:

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

Я подозреваю, что это как-то связано с определением serial copy.

Как мы можем выделить память для to, чтобы цикл имел какое-то значение?

Ответы [ 3 ]

9 голосов
/ 17 ноября 2011

Смысл такой копии в том, что она создается не в обычную память, а в последовательный регистр.

Таким образом, каждый раз, когда производится запись в адрес регистра (to), аппаратное обеспечение, связанное с регистром, будет делать что-то вроде отправки битов по последовательному каналу или передачи их в очередь для какого-либо другого оборудование для работы.

Как правило, вы даже не можете читать с адресов регистров, как это, поэтому они очень отличаются от обычных memory, и их лучше всего рассматривать как интерфейс для определенного компонента оборудования, который просто находится по адресу памяти.

4 голосов
/ 17 ноября 2011

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

У некоторых платформ есть специальные адреса, которые, когда вы читаете из / записываете в него, система выполняет некоторые операции ввода-вывода. Например, to может быть адресом, который управляет динамиком при записи. В этом случае цикл будет, например, сможет воспроизводить звук, пока *to = from[count-1]; не даст никакого полезного выхода.

2 голосов
/ 17 ноября 2011

Указатель to здесь «специальный». На определенном оборудовании вы можете получить доступ к портам ввода-вывода, записав в специальные области памяти. Если вы хотите отправить битовый паттерн через порт ввода-вывода, где паттерн уже находится в памяти, вы бы поступили именно так.

Каждая запись в to приводит к типичному изменению вывода с порта IO. Это для перебора шаблона и записи его в «специальную» память.

Как вы получаете доступ к такой «специальной» памяти, очень зависит от платформы и реализации. Иногда это просто вопрос постоянной записи по фиксированному адресу - обычно заголовок какой-либо платформы предоставляет #define или аналогичный, чтобы сделать эту информацию доступной вам во время компиляции. Иногда вам нужно сделать системный вызов, который сообщит вам адрес, на который назначено конкретное интересующее вас устройство.

...