为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

关于字节对齐

2017-12-11 4页 doc 17KB 7阅读

用户头像

is_977556

暂无简介

举报
关于字节对齐关于字节对齐 关于字节对齐 (2008-05-02 20:51:51) 分类:程序人生 标签:杂谈 本文首先提出了处理VC++中结构体时应注意的一个问题,然后详细分析了存在该问题的原因,最后做实战训练。 注意: (1)在VC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2; int ->unsigned int ->4; long ->float->4; double ->long double ->8 (2)在TC下,下面各类型占字节数为:char->uns...
关于字节对齐
关于字节对齐 关于字节对齐 (2008-05-02 20:51:51) 分类:程序人生 标签:杂谈 本文首先提出了处理VC++中结构体时应注意的一个问题,然后详细分析了存在该问题的原因,最后做实战训练。 注意: (1)在VC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2; int ->unsigned int ->4; long ->float->4; double ->long double ->8 (2)在TC下,下面各类型占字节数为:char->unsigned int ->1; short int ->2; int ->unsigned int ->2; long ->float->4; double ->8; long double ->10 一、问题提出 首先,我们来看以下两个小程序: 程序1: #include struct struct1 { char p1; short int p2; long p3; }; main() { printf(″the size of the strcu=%d,n″, sizeof(struct1)); return(1); } 运行结果是:the size of the struct=8 程序2: #include struct struct2 { char p1; long p3; short int p2; }; main() {printf(″the size of the struct=%d,n″, sizeof(struct2)); return(1); } 运行结果是:the size of the struct=12 问题:显然上述两个程序的运行结果是不同的。然而仔细观察上述两个程序,它们的唯一区 别是变量p2在结构体struct struct1和struct struct2中的位置不同。而这一不同是如何导致程序运行结果不同呢? 二、VC++中的结构体分析 C语言提供了一种称为结构体的数据类型,它可以将不同类型的数据组合成一个有机整体,这样不但便于引用,而且很清楚地反映出各数据项之间的内在联系,因而在C语言中结构体得到广泛的应用。正如我们已经熟知的那样,在C语言中,结构体的长度等于各数据项长度之和,而且结构体的长度与数据项在其中的位置顺序无关。例如,在TurboC中运行上述两个例子中的程序,得到的结果都是the size of the struct=7。这是由于char数据类型的长度是1,long数据类型的长度是4,而short int数据类型的长度是2,从而得到1+2+4=7。 那么为什么上述两个例子在VC++环境下所得的结果各不相同并且均不是7呢?在实际应用中,我们发现VC++中为结构体变量分配内存时与C语言不同:VC++中为结构体分配内存时,先分配一单位长度(该单位长度的大小等于结构体中占内存最多数据类型,如struct2的单位长度为数据类型long的长度4。),然后在该单位长度中依次为结构中的变量分配空间,直至该单位空间不能再分配完一个完整的变量时为止,就再为该结构体分配另一个单位长度的存储空间。如结构体struct2:首先,分配4个字节,p1占1个字节后,剩余的3个字节不足以分配p3,于是,系统为struct2再分配4个字节分给p3,接着下4个字节分给p2,把以,struct2共有4+4+4=12个字节。再如结构体 struct1:同样先分配4个字节,p1占1个字节后,还可为p2分配2个字节,显然剩余的1个字节不足以为p3分配空间了,因此系统还要再为该结构体分配4个字节,该4个字节恰好是p3所需的,所以struct1共有4+4=8个字节。 至此我们便不难理解上述两个例子中的结果是如何算出来的。其中,例1中是4+4=8,而例2中是4+4+4=12。 三、实战 (1)、 struct structData1 { int i; char ch; double d; short s; float f; long l; }; sizeof(struct structDate1) =(4+1+3空)+(8)+(2+4+2空)+(4+4空)=32 (2)、 struct structData2 { short int s1; char ch1; short int s2; char ch2; }; sizeof(struct structDate2) =(2)+(1+1空)+(2)+(1+1空)=8 (3)、 struct structData3 { int s1; char ch1; short int s2; char ch2; }; 4)+(1+2+1空)+(1+3空)=12 sizeof(struct structDate3) =(
/
本文档为【关于字节对齐】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索