我想重写一段(旧)代码以符合标准。旧代码使用缓冲区来存储POD结构和校验和以通过网络发送并接收它。对于发送,代码如下:在不违反严格别名的情况下使用数据缓冲区
struct MessageStruct {int a; float b;};
char buffer[sizeof(MessageStruct) + sizeof(uint32_t)];
((MessageStruct*)buffer)->a = 12;
((MessageStruct*)buffer)->b = 3.14159f;
*((uint32_t*)(buffer + sizeof(MessageStruct))) = 9876;
// Use the data buffer in some way.
SendMessage(buffer, sizeof(buffer));
接收,代码如下:
struct MessageStruct {int a; float b;};
// Receive: char *buffer, int size
const MessageStruct *message = (MessageStruct*)buffer;
uint32_t checksum = *((uint32_t*)(buffer + sizeof(MessageStruct)));
如何更新此代码,使其完全标准的投诉,特别是不违反严格的锯齿规则?
我发现了类似问题的帖子:strict aliasing and alignment,Shared memory buffers in C++ without violating strict aliasing rules。但是,这些都没有真正回答我的问题。或者他们可以,但是我没有看到它。
更新:由于一些答案已经说明,最简单的方法是使用memcpy
。我想知道,有没有什么办法可以使用placement new或其他构造来否定复制和构建它的需要?
@jrok嗯,好点。我会删除它。 – MicroVirus
顺便说一句,你可能有endianess问题 – Jarod42