1

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

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

我也可以做一个循环并做pp2[i]=pp[i]for 0 <= i <= n

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

4

3 回答 3

1

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

但是恕我直言,我想这memcpy会更快,因为有人花时间为您的特定架构/平台,并且能够使用特定的细微差别来加快速度。

于 2013-03-28T02:15:29.837 回答
1

前者使用 C 中禁止使用的标识符:任何以 . 为前缀的东西_。后者在 C89 中无效,因为结构分配在 C99 中已合理化。假设这些因素都不会导致问题,则没有功能差异。

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

于 2013-03-28T02:21:13.873 回答
0

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

于 2013-03-28T02:16:39.920 回答