一括表示

memcpy() 投稿者:JG1MOU浜田 

HAMLOG50.DLLからのエラーでは、コンパイラの最適化によりmemcpy関数
からエラーが出ているような気がしまして、気のせいかもしれません
けど、memcpy()をまったく使わないようにしてみました。
メモリブロックをコピーする関数です。

DOS版のときは、Cのソースコードにアセンブラのストリング命令を
入れて、一気にコピーしていたのですが・・・
 asm sub si, ax
 asm sub di, ax
 asm shr cx, 1
 asm rep movsw  ・・・みたいな・・・

今の32ビットコンパイラでは、別途アセンブラを用意しなければ
ならないので、インラインアセンブラが使えません。

そこで、DWORDにキャストして4バイトずつコピーしてやれば少し速い
かなぁーなんて。 次のように・・・
void __fastcall StrLCopy(char *dest, const char *src, int Count)

{ while (Count >= sizeof(DWORD)) 
{  *(DWORD *)dest = *(DWORD *)src; // 4バイトコピー
  dest += sizeof(DWORD);
  src += sizeof(DWORD);
  Count -= sizeof(DWORD);
 }
 while (Count > 0) { // 残り3バイト以下
  *dest++ = *src++;
  Count--;
 }
 *dest = (char)0x00;}



結果、一億回ほどループさせて呼び出してみると、少し速いような気が
しました。
ま、エラーが出なくなれば、それでよろし。
http://hamlog.no.coocan.jp/mou/index.html

以上、晩酌プログラミングでした。Hi

2017/11/04(Sat) 19:22:39  [No.830]


Re: memcpy() 投稿者:JA7UDE 大庭 

浜田さん、こんばんは、

これはコンパイラか標準ライブラリにバグがあるということでしょうか?自分はmemcpy()をよく使うもので、心配になりました。

73
大庭
JA7UDE

2017/11/04(Sat) 21:39:31  [No.831]


Re: memcpy() 投稿者:JG1MOU浜田 

> これはコンパイラか標準ライブラリにバグがあるということでしょうか?自分はmemcpy()をよく使うもので、心配になりました。

大庭さん、その節は大変お世話になりました。

これは、私が使っている大昔の Borland C++ 5.02Jでの話です。
なんせ1997年製ですから。Hi

バグではないと思うのですが、最適化の過程でおかしなコードが生成
されているのか、メモリリークなのか、わかりません。
私の場合は、数ヶ月に一度、お目にかかれるかどうかのエラーです。

人によっては、ハムログが落ちてしまうそうですので、動作環境に
よるみたいです。

Visual C++に移植すれば問題なくなるのかもしれませんが、定年後に
時間的な余裕ができたら、遊んでみたいと思ってます。

2017/11/04(Sat) 22:11:39  [No.832]


Re: memcpy() 投稿者:JA7UDE 大庭 

浜田さん、こちらこそお世話になっております。そうですか、Borland C++ 5.0をお使いということで、わたしも、簡単なプログラムにはC++ Builder 5.0を使っています。ずいぶん古いものになってしまいましたが、動作が軽くて、なかなか手放せません。memcpyは、領域をオーバーランしたり、コピー元とコピー先が重なっているとまずいのですが、手軽なので、つい使ってしまっています。また、いろいろご指導ください。

73
大庭
JA7UDE

2017/11/10(Fri) 19:25:53  [No.833]