假设我有结构:
typedef struct {
double re;
double im;
}ComplexStruct;
和数组:
typedef double ComplexArr[2];// [0] -> real, [1] -> imag
今天我使用简单的
ComplexStruct
循环从 ComplexArr
复制到 for
,反之亦然://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,它将在每次迭代中将整个内容展开为一个加载和一个存储。