我有一个多播某些打包 POD 结构的应用程序和一个在其他二进制文件中运行的侦听器服务。侦听器服务知道结构是什么样的,因此当它接收到它们时,它会将其转换回用 a 敲击的结构reinterpret_cast
并执行回调。
下线的问题是,如果二进制文件被发布并且需要将新信息添加到结构中,则必须重新构建这些二进制文件,否则它们将reinterpret_cast
滥用和滥用信息。在生产环境中,这可能是一个问题,因为它一直没有那种灵活性。
有人告诉我的一件事是,解决方法是引入新样式的消息,并将它们都发送出去……随着时间的推移,应用程序最终将切换到新类型的二进制消息,直到可以停止发送旧的。我想知道是否有更好的选择。
例如,如果一个人约定只在打包结构的末尾添加新字段,那么旧的监听二进制文件可能仍然能够访问这些新字段,如果他们愿意,使用旧信息构建的那些可能仍然能够访问顶部。例如,如果发送者正在多播:
struct foo {
int a;
char b[2];
} __attribute__ ((packed));
然后在接收端构建了几个二进制文件,这些二进制文件通过网络获取const char* msg
消息并执行以下操作:
foo* fooPtr = reinterpret_cast<foo*>(msg);
registeredGuy->callback(fooPtr);
现在,如果我们决定在发送方推出额外的信息,如果我们像这样将它固定到底部,老听众可能会没事:
struct foo {
int a;
char b[2];
char newStuff[17];
int k;
} __attribute ((packed));
老接收者应该仍然能够成功投射和访问他们的旧信息,而新人可以访问新内容。这是真的?是否有更好的解决方案不会影响速度(性能非常关键)