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

标签 c arrays struct memcpy

假设我有结构:

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/

相关文章:

c - 使用按位运算符查找是否每个偶数位都设置为 0

c - 如何使用 openssl 通过本地信任库验证 PEM 中的证书?

c++ - 模板化类中带有模板对象的结构

c++ - 结构中的 union 初始化

c - 理解 size_t 类型和 sizeof 运算符的问题

c - 从数据到 OpenGL 二维纹理

java - Java 中反转数组顺序

c++ - 数组元素打印的递归方法

javascript - 查找包含数组一个元素的元素

c# - 要构造的字节数组