带有柔性阵列构件的包装结构的便携式替代方案
Portable alternative for packed structures with a flexible array member
>假设我们正在编写一个使用 UDP 套接字的C++网络应用程序。我们需要传递一个不那么小的数据包,所以我们使用了这种结构,确保字节顺序是网络顺序:
struct [[gnu::packed]] datagram {
uint64_t timestamp;
uint8_t type;
uint32_t temperatures[60]; // whatever, just an example
uint8_t raw_data[];
};
我们使用的是GNU GCC,所以我们利用了非标准的C++特性,如
- 灵活的阵列成员
- 包装结构
我们需要一个打包的结构,因为我们不希望中间有填充,因为这可能依赖于架构,并且我们的网络程序可以在不同的架构上运行。
然后,一年后,我们可能会发现我们需要支持一个不支持这些的非 GCC 编译器。
是否可以在标准C++中执行此操作?
当然,我知道我们可以简单地使用uint8_t buffer[SOME_SIZE]
和memcpy数据报的每个部分,但这听起来像是创建可怕,非常丑陋的代码的好方法。
[[gnu::packed]]
是在任意体系结构之间进行序列化的糟糕方法。 那里仍然有大端机器。
执行此操作的正确方法是根据八位字节定义序列化格式,然后在八位字节流(传入或传出 UDP 套接字(和排列良好的结构之间进行转换。
有许多库使这变得简单明了。 我们在工作中使用protobuf
;以前的雇主有一个自制的解决方案。 (请注意,对此类库的建议请求对于堆栈溢出来说是明确的题外话。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- 带有柔性阵列构件的包装结构的便携式替代方案
- 故障化谷物便携式结构