【发布时间】:2015-09-25 14:58:16
【问题描述】:
我想重写一段(旧)代码以符合标准。旧代码使用缓冲区来存储 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 或其他不需要复制并就地构造它的构造来做到这一点?
【问题讨论】:
-
IIANM,语言律师标签主要用于正式的标准问题,而不是实际问题。
-
@jrok 嗯,好点子。我会删除它。
-
顺便说一句,你可能有字节序问题
-
@Jarod42 是的,确实如此,但幸运的是,现在这不是问题。
标签: c++