質問: memcpyはどのように行われる関数なのでしょうか? 私は動的配列(int型)のプログラムを書き、100000000個のデータを挿入、削除させました。 すると、初期配列サイズが11の場合と2100000001の場合とで実行時間の差異がほとんど見られませんでした。 (その差はおよそ0.22秒) 挿入時に一杯であれば、元の配列の内容を新たに作った大きさ2倍の配列にmemcpyで移し換え、元の配列は解放します。 2の場合には配列は拡張することがなく、1の場合には27回拡張することになりますが、ここの差はほとんどないと思います。 問題はmemcpy関数で移し変える時だと思いもす。 最大で67108864(2^26)個のデータを移し変えることになりますが、memcpyはそれでも差が出ないような仕様なのですか? また、ライブラリ関数の中身を見る方法があれば、合わせて教えてください。 諸事情によりプログラムは載せられませんが、ご回答よろしくお願いします。
回答: メモリアクセスにかかる時間ですが、 (1個から2^26個までの和で)2^27個=512MBもあるとキャッシュには乗らずメインメモリまでアクセスされるでしょうから、メモリの転送速度を調べてみると、 最近主流のDDR4-2400で19.2GB/秒。クアッドチャンネルなら4倍。 76.8GB/sで0.5GB×2(読み+書き)を転送する時間は0.013秒と計算できます。シングルチャンネルでも0.052秒。 実際には理論値が出るわけではないにせよ、0.22秒には遠いです。