C/C++中Protocol Buffers生成的结构体成员顺序是否无保障?
Protocol Buffers 3 生成代码的结构体成员顺序问题
我通过以下代码定义了Protocol Buffers3消息:
message M { uint32 first = 1; uint64 second = 2; }
但生成的.h头文件中结构体成员顺序却变为:
struct M { std::uint64_t second{}; std::uint32_t first{}; }
请问是否不存在成员顺序的保障?
是的,Protocol Buffers 3 并不保证生成的代码中结构体成员的顺序和你在 .proto 文件中定义的顺序一致。
Protobuf 编译器会自动调整结构体成员的顺序,这么做通常是为了优化内存布局——比如按成员的字节大小从大到小排列,减少内存对齐带来的空间浪费。你遇到的uint64_t(8字节)排在uint32_t(4字节)前面的情况,就是编译器出于内存优化做出的调整。
需要注意的是,Protobuf 的序列化和反序列化逻辑完全依赖字段的标签号(也就是你定义的=1、=2这类标识),和结构体成员的内存顺序无关。只要标签号正确,不管生成的结构体成员顺序如何变化,数据的序列化、反序列化都能正常工作。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

