gpt4 book ai didi

c - 在 C 中使用 memcpy 将数组复制到结构,反之亦然

转载 作者:太空狗 更新时间:2023-10-29 16:09:55 24 4
gpt4 key购买 nike

假设我有结构:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com