memcpy和copy之间的区别

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

这工作正常还是我应该担心编译器的填充等?

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

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

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

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

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

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

如果我这样做的话,也要对整个结构进行反序列化

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

这工作正常还是我应该担心编译器的填充等?

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