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

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

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

我也可以做一个循环并为0 <= i <= npp2[i]=pp[i]

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

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

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

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

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

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