memcpy和copy之间的区别

时间:2018-02-01 20:34:53

标签: c++ c memcpy

Struct A
{
   uint16_t len;
   uint8_t  cnt;
   uint8_t  unit;
   uint32_t seq; 
};

此结构A被序列化为char * buf。如果我想反序列化各个值,例如:

uint16_t len = 0;
memcpy(&len, buf, sizeof(len));

或者我可以做

uint16_t len = (uint16_t) buf;

哪一个更好或者两者都相同?

如果我只是做

,也要对整个结构进行反序列化
A tmp;

memcpy(&tmp, buf, sizeof(A));

这可行吗或我是否应该担心来自编译器的填充等?

1 个答案:

答案 0 :(得分:8)

当数据被复制到char[]缓冲区时,它可能无法在内存中正确对齐以便作为多字节类型进行访问。将数据复制回struct会恢复正确对齐。

  

如果我想反序列化各个值,例如:

uint16_t len = 0;
memcpy(&len, buf, sizeof(len));

假设您已将struct复制到buf,这是完全有效的,因为语言保证初始成员将与结构的开头对齐。但是,将buf转换为uint16_t*是无效的,因为缓冲区很多未在内存中正确对齐,无法作为uint16_t进行处理。

请注意,获取除初始元素之外的结构元素需要计算适当的偏移量:

uint32_t seq;
memcpy(&seq, buf+offsetof(struct A, seq), sizeof(seq));
  

如果我只是做

,也要对整个结构进行反序列化
A tmp;
memcpy(&tmp, buf, sizeof(A));
     

这可行吗或我是否应该担心来自编译器的填充等?

这样可以正常工作。将struct复制到buf时,tmp中嵌入的任何填充都将与实际数据一起返回alert