对于 C 语言来说,编译器会将 memcpy 和循环赋值都优化成几条汇编指令,因此它们生成的代码效率相同。教科书中大多数讨论的是在「无编译器优化」的情况下,这种情况并不适用于大多数场景。实际上,标准库的 memcpy 函数一定会开启优化,而你自己的代码可能没有开启优化。因此,在优化到位的情况下,memcpy 和循环赋值都会生成相同的代码,效率都是 SIMD 级别(即一次复制多条数据)。因此,个人建议使用 memcpy 函数,因为明确的函数调用可以使你的代码意图更明确,程序可读性更高。
就像在编写 C++ 时,我会尽量推荐使用 #include <algorithm> 中的通用算法一样。尽管有时你可能认为没有必要调用这些通用算法,自己手写也完全没有问题,但是调用这些通用算法的代码本身就是最好的注释,后来的开发人员可以清晰地理解这段代码想要实现的功能。毕竟,通用算法的语义是公共知识,是共识,而不是需要阅读这个特定程序才能理解的东西。
刚好,我这里有C语言资料包,私信我领取