memcpy性能与字节移位

时间:2015-07-28 08:40:57

标签: c memory-management memcpy

有两个变量:

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));

我很感激所有提示。

3 个答案:

答案 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会更快,因为它不计算只使用移动。字节移位有两步计算。