假设我有结构:
typedef struct {
double re;
double im;
}ComplexStruct;
和数组:
typedef double ComplexArr[2];//[0] -> real, [1] -> imag
今天我使用简单的 for
循环从 ComplexStruct
复制到 ComplexArr
,反之亦然:
//ComplexArr to ComplexStruct
for (i = 0 ; i < NumEl; i++)
{
ComplexStructVec[i].re = ComplexArrVec[i][0];
ComplexStructVec[i].im = ComplexArrVec[i][1];
}
//ComplexStruct to ComplexArr
for (i = 0 ; i < NumEl; i++)
{
ComplexArrVec[i][0] = ComplexStructVec[i].re;
ComplexArrVec[i][1] = ComplexStructVec[i].im;
}
有没有办法至少在其中一个方向上安全地使用 memcpy
?有没有比 for
循环更快的方法?
最佳答案
您的编译器中的优化器应该可以很好地处理该代码,您无需进行太多更改即可使其达到最佳状态。但是,如果您将 ComplexStructVec 和 ComplexArrVec 传递给一个函数,您应该将它们标记为 restrict
以便编译器知道没有发生别名。像这样:
void copy(ComplexStruct* restrict ComplexStructVec, const ComplexArr* ComplexArrVec)
{
unsigned NumEl = 1000;
for (unsigned i = 0 ; i < NumEl; i++)
{
ComplexStructVec[i].re = ComplexArrVec[i][0];
ComplexStructVec[i].im = ComplexArrVec[i][1];
}
}
通过这样做,您消除了一大堆生成的代码,因为它不需要处理两个参数重叠的可能性。
演示:https://godbolt.org/z/F3DUaq (只需删除那里的“限制”以查看区别)。如果 NumEl 小于 18,它会将整个事情展开为每次迭代一次加载和一次存储。
关于c - 在 C 中使用 memcpy 将数组复制到结构,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57787885/