CopyMemoryとは何者?


業務でJavaとかC#、プライベートでもPHPとかしかやってない俺が
C++やって死にそうになっています。
ちなみにCは少しだけ勉強した記憶がある程度。
で、そんなときにぶち当たる壁というのがポインタです。
一応Javaなんかでも参照変数みたいなのがあって
ある意味ポインタちっくな概念があるにはありますが
やっぱりC++みたいにポインタ使ってナンボな言語は
俺みたいなポインタ初心者はドン引きなんですね、はい。


で、今回CopyMemoryっていうWindows APIを使う必要があったので
ちょっと調べてメモっておきます。
できる人にとっては常識なんでしょうが、まぁいいじゃないですか。


まずこのCopyMemoryは何をするAPI?という疑問についてですが
指定したメモリブロック(メモリ上のデータの塊)の内容を
他のメモリアドレス位置にごっそりコピる事ができるらしいです。


ではどんな時に使うのか?ってのを考えてみると…
例えば、めちゃめちゃ沢山の配列要素を別の配列にコピりたい時
for文でぐるぐるやるよりCopyMemoryを使った方が
圧倒的に処理効率が良いようです。
だからこんな時はこのAPIを使用すべきです。
なんてったってこれ一個書くだけで
スパッとよろしくやってくれるんですから。


で、書き方は以下の通り。

VOID CopyMemory(
  PVOID Destination,   // コピー先
  CONST VOID *Source,  // コピー元メモリブロック
  SIZE_T Length        // メモリブロックのサイズ
);


パラメータはこんな感じです。

Destination
コピー先の開始アドレスへのポインタ。
例えるなら引越し先の住所ってとこかな。

・Source
コピー元のメモリブロックの開始アドレスへのポインタ。
まぁ現住所みたいなもんでしょう。

・Length
コピーしたいメモリブロックのバイト数。
引越し荷物の量でいいや(適当すぎか?)。


この時、Lengthには特に注意した方が良いみたいです。
重要なメモリ領域を書き換えてしまって
最悪OSが落ちる事もあるという、あぁ恐ろしい。


というわけで、使用例は良いのが思いついたら追記したいと思います。
まずはここまでという事で。