使用memcpy与直接方法复制结构数组

时间:2013-03-28 02:02:26

标签: c memcpy

假设pp是指向长度为n的结构数组的指针。 [动态分配] 假设我想创建该结构数组的副本并使用以下方式指向它:

struct someStruct* pp2 = malloc(_appropriate_size_);
memcpy(pp2, pp, _appropriate_length_);

我也可以制作一个循环,为pp2[i]=pp[i]执行0 <= i <= n

这些方法之间有什么区别,哪个更好,为什么?

3 个答案:

答案 0 :(得分:1)

所有架构都没有明确的答案。您需要进行性能分析以确定哪种方法最佳。

然而恕我直言,我会想象memcpy会更快,只是有人花了你的特定架构/平台的时间,并能够使用特定的细微差别来加快速度。

答案 1 :(得分:1)

前者使用C中禁止的标识符:前缀为_的任何内容。后者在C89中无效,因为结构赋值在C99中合理化。假设这些因素都没有引起问题,则没有功能差异。

更好定义不明确;如果您在C89 中将编译为“更好”,则前可能更好。但是,如果您定义“更好”,因为在C99中没有未定义的行为,那么后者更好。如果您将“更好”定义为更优化,则没有明确的答案,因为一个实现可能会为两者产生较差的性能,而另一个实现可能会为一个实现性能不佳而另一个实现最佳代码,或者两者都是相同的代码。无论如何,这很可能不是你算法的瓶颈......

答案 2 :(得分:0)

我会说memcpy更快 - 通常针对底层平台进行调整,并且可能使用DMA启动的传输(没有L1 / L2缓存副本)。 for循环可能涉及额外的转移。但是,它取决于底层编译器的智能程度 - 如果它发现n的静态定义值,它可以用memcpy替换它。正如Mystical所提到的,值得计划例程或检查汇编代码。