关于内存对齐_第1页
关于内存对齐_第2页
关于内存对齐_第3页
关于内存对齐_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、关于内存对齐作者:赖锋曾经接手一个网络视频监控程序,主要是上层软件通过发送控制指令获取网络视频板的视频数据和控制网络视频板, 这应该是一个比较简单的流程! 一切的开发都很顺利,测试的时候 ,问题就来了 ,获取视频数据流的数据竟然是错误的,我糊涂了 ,把整个程序流程,用调试器一步一步地跑,到了发送视频指令的时候,返回指令操作错误的结果 ,怎么回事 ? 我是按照视频的操作指令封装的数据包,内存显示数据包的内容是没有错误的,就是一个晚上 ,我不停地找 错误 ,只有偶然,我把sizeof() 这个指令直接换掉,把数据包全部用一个byte 的数据进行copy,程序成功执行!这时 ,我已经快晕了! 数据发

2、送到网络板的数据包大小根本不是实际控制数据包的大小! 这时我才想起一个人, stanley b. lippman, 他写的那一本书inside object modale, 曾经提过这样的事情,编译器为了提高cpu 的效率 ,会对 struct 的结构进行优化, 利用 sizeof 可以得出不同的计算机上对struct 的结构优化后的大小值.以前是看过 ,但是 ,却没有深刻理会,现在,吃了苦头 ,才明白 ! 这是我的理解,c+ 编译器为了使cpu 的性能达到最佳,会对struct 的内存结构进行优化,这是为了达到cpu 数据传输总线的吞吐值,各个计算机的数据传输总线是不一样的, 如32 位的计

3、算机的数据传输值是4 bytes,64 位计算机数据传输是8 bytes,这样 ,struct 在默认的情况上 ,编译器会对struct 的结构进行数据对齐(32 位机 )4 的倍数或 (64 位机 )8 的倍数 ),如下面这段代码所示: #include typedef struct tagpackage int intvalue; char chvalue1; char chvalue2; package, * lp_package; int main() package package; std:cout sizeof( package ) = sizeof( package ) std

4、:endl; return 0; 程序执行结果为8 ( sizeof( int ) + sizeof( char ) + sizeof( char ) + 对齐值)为 8. (我的机子是32 位,4*2=8) 一切都是编译器搞得自已头晕,但是为什么以前自已写的网络程序没有这种情况 ?同样的数据包传输,我并没有阻止编译进行强制对齐,我猜可能是操作系统都是一样(都是 winx 系统 )的才没有出现问题,而现在的网络视频板是内嵌式linux, 对数据包的处理是纯数据 (不经对齐的数据)是敏感的所以,才会出现这样的问题! 这种情的解决方法是阻止编译器对数据包对齐,因为数据对齐的时候,编译器会塞入一些没

5、有意义的数据对结构进行对齐,使用 #pragma 强制编译器产生指定数据对齐方式,如下代码所示#pragma pack(push) #pragma pack(1) typedef struct tagpackage int intvalue; char chvalue1; char chvalue2; package, * lp_package; #pragma pack(pop) typedef struct tagpackage2 int intvalue; char chvalue1; char chvalue2; package2, * lp_package2; int main() package package; package2 package2; std:cout sizeof( package ) = sizeof( package ) std:endl; std:cout sizeof( package2 ) = sizeof( package2 ) std:endl; return 0; 对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论