有两个变量:
uint32_t var32 = 0xAABBCCDD;
uint8_t var8[4] = { 0, 0, 0, 0 };
var32到var8的哪种复制方式会更快?
for (size_t i = 0; i < sizeof(uint32_t); i++)
var8[i] = (uint8_t)(var32 >> (i * 8));
或
memcpy(var8, &var32, sizeof(uint32_t));
我很感激所有提示。
答案 0 :(得分:5)
假设采用32位架构,memcpy
归结为单个mov
(或类似)指令。所以 更快。但这也是错的。从C的角度来看,您正在调用实现定义的行为。实际上可能发生的是你的字节被错误地排序,这取决于你是在 big endian 还是 little endian 平台上。因此,只需使用位移解决方案而不是担心性能。
答案 1 :(得分:2)
现代编译器通常保证C中的memcpy优化为最快的复制方式。但是,这确实假设它在您的实现中正确内联。
我也不相信这会导致严格的别名冲突,因为两个指针永远不会为同一个内存添加别名。
然而,int的字节被复制到数组的哪个字节的顺序是实现定义的。如果你希望确保这将总是在大端序中,你可以首先在int上运行htonl
,这将使它成为大端,然后复制的结果将被很好地定义。在不需要的情况下,这也将优化为零,使其始终是任何系统上最快的实现。
另一方面,如果您想要小端字节排序,请使用htole32
以确保int在任何硬件上变为小端。但要注意htole32
是BSD,Linux和各种其他操作系统的扩展,并不保证可用于所有实现(读取,非标准)。
答案 2 :(得分:-2)
我认为memcpy会更快,因为它不计算只使用移动。字节移位有两步计算。