开发者社区> 问答> 正文

网络编程和字节对齐的问题?

struct TestClass
{    
    int a;
    double b;
};
这个结构体占用的内存的大小是16字节(windows下),它在内存里面按照double的字节大小对齐。

TestClass demo = {1, 1.1};
定义一个对象后,通过网络把这个demo对象发出去。

write(sockfd, &demo, sizeof(demo));

这样是发出去16个字节对吧?这样发出去的数据就包含了编译器字节对齐插进去的4个字节了吧?我的理解对吗?

如果把这个demo对象序列化为二进制的话是不是就是把demo里的int和double的值复制到一个缓冲区里,这样这个缓冲区的里面的值的长度就是12字节了(int + double)。这样的话,通过网络发送这个缓冲区里的数据的话就不包含字节对齐的值了吧,这就是序列化的意义吗?

求大神告诉我理解的对不对?不对的话我的哪些地方没有理解对呢?

展开
收起
a123456678 2016-06-12 10:57:02 2489 0
1 条回答
写回答
取消 提交回答
  • 你的理解是对的,编译器会帮你做对齐, 如果你要序列化,也要考虑这个对齐的问题,否则就会有问题,不能简单的拷贝拷贝。
    当然,正确的做法是对于网络上传输的结构,自己指定对齐的方式,在windows 下你可以使用 #pragma pack(4) 来指定对齐,比如按 4字节对齐,那么整个结构就不会有额外的内容了,当然你也可以简单的按1个字节对齐。在linux下方法有些不同,你可以google一下这方面的东西,关键字 结构体 对齐 网络

    2019-07-17 19:33:28
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Session:更加安全、可靠的数据中心网络产品更新 立即下载
Session:极简易用的全球化网络产品更新 立即下载
Session:弹性、高可用、可观测的应用交付网络产品更新 立即下载