假设我有结构:

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,它将在每次迭代中将整个内容展开为一个加载和一个存储。

10-08 13:37