多くの場合、コピーする必要があり、非常に大きくなる可能性がある配列を含む構造があります。
struct XYZ
{
...
double *x, *y, *z;
uint count;
};
現在、Daniel Vik は彼のブログで...
http://www.danielvik.com/2010/02/fast-memcpy-in-c.html
...このコードを、C++ で連続した配列をコピーするためのより高速な手段として提示しています (それはmemcpy のエラーチェックといくつかの特別な条件のものがないため、より高速です):
void* memcpy(void* dest, const void* src, size_t count) {
char* dst8 = (char*)dest;
char* src8 = (char*)src;
--src8;
--dst8;
while (count--) {
*++dst8 = *++src8;
}
return dest;
}
私は自分の型を知っており、通常は新しいコピーを返すcount--
よりも高価であるため、これを多少調整しました。--count
だから私の結果は次のとおりです。
struct XYZ
{
void Copy(XYZ & dest)
{
size_t len = count * sizeof(double)+1;
char* dest8_x = (char*)dest.x;
char* dest8_y = (char*)dest.y;
char* dest8_z = (char*)dest.z;
char* src8_x = (char*)x;
char* src8_y = (char*)y;
char* src8_z = (char*)z;
--dest8_x;
--dest8_y;
--dest8_z;
--src_x;
--src_y;
--src_z;
while (--len)
{
*++dest8_x = *++src8_x;
*++dest8_y = *++src8_y;
*++dest8_z = *++src8_z;
}
}
...
double *x, *y, *z;
uint count;
};
この戦略を最大限に活用することについて、いくつか質問があります。
- 2 つのターゲットにコピーする場合...同じメモリをインターリーブするか
XYZ & dest1
、1 つの構造体のすべてのメンバーをコピーしてから次の構造体にコピーする方が効率的でしょうか?XYZ & dest2
*this
- スケーリング係数を適用したい場合、
double coefficientA
またはdouble offsetB
加算または乗算を介して 1 つの値または値の範囲に適用したい場合、これをより効率的にコピー操作に組み込むことは可能ですか。
場合によってはプログラムの特定の実行のために最適化したいという欲求の簡単な正当化を提供するためにcount>100000
、そして多くの場合、コピーされた一連の座標に対して最初に行うことは、選択した値をそれらすべてに一貫して追加することです。