依赖工程的关字节对齐问题
2013-01-07 11:06
134 查看
最近由于项目的字节对齐导致了2次比较诡异的内存问题。这里进行一次总结,首先描述一下第一次的现象。
我们项目的网络是使用IOCP做的,是一个包含IOCP封装和本地数据结构与网络字节流的序列化和反序列化的一个库。作为一个lib客户端和服务器共用的。一次客户端的开发发现协议内容解析一直不正确,跟踪调试发现同一个结构体大小一下子20,一下子24。然后仔细一看,在lib里面是24,在客户端代码里面就是20。最后我们就得出结论是lib和客户端工程对齐方式不一致的问题导致的。lib工程的Struct Member Alignment使用的是default(/Zp8),而客户端工程使用的是/Zp4。
第一个案例还比较好发现,第二个案例就完全是猜测了。
我们服务器使用luabind+c++实现了自动发包工具,原来只要在lua脚本里面生成一个协议包就直接发出去了,现在却发现一发包就崩在luabind的member赋值过程中了。根本无法完全确定原因。不过第一个案例就在最近,我才猜了一下,可能luabind工程对齐方式跟我们的网络lib对齐方式不同导致的。结果对了。不然这个问题的解决肯定是遥遥无期了。
总结:依赖工程之间对齐方式不同,共用了结构体,那肯定导致问题的。问题包括数据不对,结构体多种size,程序崩溃。
我们项目的网络是使用IOCP做的,是一个包含IOCP封装和本地数据结构与网络字节流的序列化和反序列化的一个库。作为一个lib客户端和服务器共用的。一次客户端的开发发现协议内容解析一直不正确,跟踪调试发现同一个结构体大小一下子20,一下子24。然后仔细一看,在lib里面是24,在客户端代码里面就是20。最后我们就得出结论是lib和客户端工程对齐方式不一致的问题导致的。lib工程的Struct Member Alignment使用的是default(/Zp8),而客户端工程使用的是/Zp4。
第一个案例还比较好发现,第二个案例就完全是猜测了。
我们服务器使用luabind+c++实现了自动发包工具,原来只要在lua脚本里面生成一个协议包就直接发出去了,现在却发现一发包就崩在luabind的member赋值过程中了。根本无法完全确定原因。不过第一个案例就在最近,我才猜了一下,可能luabind工程对齐方式跟我们的网络lib对齐方式不同导致的。结果对了。不然这个问题的解决肯定是遥遥无期了。
总结:依赖工程之间对齐方式不同,共用了结构体,那肯定导致问题的。问题包括数据不对,结构体多种size,程序崩溃。
相关文章推荐
- C++中结构体的字节对齐问题
- C/C++_字节对齐问题总结
- C语言中一个字节对齐问题的分析
- Activiti系列:如何把Activiti工程转换为maven工程以解决依赖项找不到的问题
- c++内存中字节对齐问题详解
- C/C++ 字节对齐问题
- 关于#pragma pack()字节对齐问题
- C/C++字节对齐问题总结
- DSP中字节/字对齐的问题
- 【转载】 -- 关于C编译器里字节对齐的问题
- c++内存中字节对齐问题详解
- 关于字节对齐存储的问题
- 结构体、联合体的应用,以及字节对齐和字节序的问题
- 深入研究字节对齐问题
- WinCE 下最简单的字节对齐问题
- 结构体有字节对齐和字节补齐问题
- 字节序与字节对齐问题
- eclipse中JAVA WEB工程依赖工程布署问题
- x86的字节对齐与不对齐的问题
- 内存字节对齐问题!