gpt4 book ai didi

c++ - 在不违反严格别名的情况下使用数据缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:39 25 4
gpt4 key购买 nike

我想重写一段(旧)代码以符合标准。旧代码使用缓冲区来存储 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 或另一种不需要复制并就地构建它的结构来做到这一点?

最佳答案

在您的情况下,避免违反严格别名规则的最简单方法是将 memcpy() 填充到您的缓冲区中。

关于c++ - 在不违反严格别名的情况下使用数据缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32785059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com