我有一个带有数组的结构,这些数组通常需要复制并且可能非常大。
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
和XYZ & dest2
相同的内存*this
,交错它们或复制一个结构的所有成员然后下一个结构会更有效吗? - 如果我想应用一些缩放因子
double coefficientA
或double offsetB
通过加法或乘法到一个值或一系列值,是否可以更有效地将其合并到我的复制操作中。
为了给优化的愿望提供一个简短的理由,有时count>100000
对于我的程序的给定运行,并且通常我对复制的一组坐标做的第一件事就是向所有坐标添加一个选定的值。