- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于内存对齐
作者: 赖锋
曾经接手一个网络视频监控程序,主要是上层软件通过发送控制指令获取网络视频板的视频数据和控制网络视频板, 这应该是一个比较简单的流程!
一切的开发都很顺利,测试的时候,问题就来了,获取视频数据流的数据竟然是错误的,我糊涂了,把整个程序流程,用调试器一步一步地跑,到了发送视频指令的时候,返回指令操作错误的结果,怎么回事?
我是按照视频的操作指令封装的数据包,内存显示数据包的内容是没有错误的,就是一个晚上,我不停地找错误,只有偶然,我把sizeof()这个指令直接换掉,把数据包全部用一个BYTE的数据进行copy,程序成功执行!这时,我已经快晕了!
数据发送到网络板的数据包大小根本不是实际控制数据包的大小!
这时我才想起一个人, Stanley B. Lippman,他写的那一本书 Inside object modale, 曾经提过这样的事情,编译器为了提高CPU的效率,会对struct 的结构进行优化, 利用sizeof 可以得出不同的计算机上对 struct 的结构优化后的大小值.以前是看过,但是,却没有深刻理会,现在,吃了苦头,才明白!
这是我的理解,C++ 编译器为了使CPU的性能达到最佳,会对 struct 的内存结构进行优化,这是为了达到CPU数据传输总线的吞吐值,各个计算机的数据传输总线是不一样的, 如32位的计算机的数据传输值是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::endl;
return 0;
}
程序执行结果为 8 ( sizeof( int ) + sizeof( char ) + sizeof( char ) + 对齐值 )为8. (我的机子是32 位,4*2=8)一切都是编译器搞得自已头晕,但是为什么以前自已写的网络程序没有这种情况?同样的数据包传输,我并没有阻止编译进行强制对齐,我猜可能是操作系统都是一样(都是WinX系统)的才没有出现问题,而现在的网络视频板是内嵌式linux,对数据包的处理是纯数据(不经对齐的数据)是敏感的所以,才会出现这样的问题! 这种情的解决方法是阻止编译器对数据包对齐,因为数据对齐的时候,编译器会塞入一些没有意义的数据对结构进行对齐,使用#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;
}
对指定的数据包编译时进行内存对齐,这样,也不会让编译器对其数据进行优化!
总结:
C++的编译器总是在背后做了很多事!网络数据处理或与内嵌式设备打交道的时候,这更应该小心!
您可能关注的文档
最近下载
- 2023年保险中介从业人员资格考试模拟题与答案217.pdf VIP
- 《2019版预防和治疗压力性损伤快速参考指南》简要分享.ppt VIP
- (2025秋新版)人教版二年级数学上册全册教案.doc
- 河北省2012装饰装修定额说明及计算规则(含定额总说明.doc VIP
- 新沪教牛津版九年级上册英语全册教案.pdf VIP
- 阀门井阀门更换施工方案.docx
- 2025年度酒店预订服务合作协议.docx VIP
- GB/T 4214.17-2024家用和类似用途电器噪声测试方法 干式清洁机器人的特殊要求.pdf
- 国防幼儿园主题课件.pptx
- 2025上海韩天衡美术馆招聘1人笔试模拟试题及答案解析.docx VIP
文档评论(0)