6

シリアルコピーとは?ディープコピーとシャローコピーとの違いは?

Duff's device の下の wiki エントリによると、従来は次のように実装されていました。

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

そして、それは次のようにメモします。

toDuff が単一のメモリ マップ出力レジスタにコピーしていたため、 はインクリメントされていないことに注意してください。

この注意書きがよくわかりませんでした。

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コンパイル時にその情報を利用できるようにするために、または類似のものを提供します。場合によっては、関心のある特定のデバイスがマップされているアドレスを知らせるシステム コールが必要になることがあります。

于 2011-11-17T10:07:27.687 に答える