网站大量收购独家精品文档,联系QQ:2885784924

C语言中级 2.数据类型.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言中级 2.数据类型

* 对于VC++(32)平台,结构体变量对于内存的占用以及发生原因。(与TC的区别) 看后页例: struct S { char a; int b; double c; } sa; 其中sizeof(char) =1; sizeof(int) = 4; sizeof(double) = 8; 所以sizeof(sa)应该等于1+4+8=13才对。那只是人们的一厢情愿,其实不然。会等于16。 * 32位的CPU读内存时,一次读取四字节的内容,因为字长是32位的,并且读取的地址是被4整除的!即0,1,2,3这样的连续的地址,而不是2,3,4,5这样的地址! #pragma pack () 其实一点也不怪,C/C++是按pack算法的对齐基数来决定结构体大小的。 若有 struct A { long l; int i; short s; char c; }; 若按基数为1字节计,该结构体的大小为15;按2字节计,大小为16;按8字节计,大小为32。 而基数是按字长的整数倍来确定的(为了效率),并且各编译器各有自己的原则,甚至有的编译器还可以用选项指定倍数。 * 32位的CPU读内存时,一次读取四字节的内容,因为字长是32位的,并且读取的地址是被4整除的!即0,1,2,3这样的连续的地址,而不是2,3,4,5这样的地址! #pragma pack () 其实一点也不怪,C/C++是按pack算法的对齐基数来决定结构体大小的。 若有 struct A { long l; int i; short s; char c; }; 若按基数为1字节计,该结构体的大小为15;按2字节计,大小为16;按8字节计,大小为32。 而基数是按字长的整数倍来确定的(为了效率),并且各编译器各有自己的原则,甚至有的编译器还可以用选项指定倍数。 * 结构体每个成员的变量的首地址能够被该成员大小与对齐基数中的较小者所整除; * 因为有些操作系统不自动对齐。需要我们手动添加填充字节! //#pragma pack(push) //#pragma pack(1) struct A { char c1; int a; float f; char c2; }; //#pragma pack(pop) * sizeof(sa)=8 。 sb中的int a 占4个字节,紧接着的char b占1个字节,但char b随后的double c需要占用8个字节,所以char b和double c不能挤在4个字节里。于是在char b和double c间填了3个字节的空位,实现了数据对齐。这样就不难理解为什么sizeof(sb)=16了。 我们试图按同样的思路理解sc又会出问题:sizeof(sc)似乎等于4+8+4=16才对,可是输出的结果却是sizeof(sc)=24。 看来刚才的“猜想”是有问题的。问题出在哪儿呢?为什么分析sa和sb都没有问题,到sc就出现问题了呢?sb和sc的唯一区别就是char b和double c的定义次序颠倒了,这使得sb的a和b可以共居于一个对齐单位8,而sc的a和b则要各占一个对齐单位8。 * sizeof(A) = 16; sizeof(struct B) = 32 * 聪明的编译器可能会注意到你两次使用x,而没有改它的值,它将把x临时存储在一个寄存器中,接着在需要的时候,可以通过从寄存器而非初始的内存位置中读取该值,以节省时间。这个过程被称为缓存,但如果在两个语句间其他代理改变了x的话就不是这样了,如果没有规定volatile关键字,编译器将无从得知这种改变是否可能发生,因此,为安全起见编译器不使用缓存,现在,如果声明中没有使用关键字volatile,编译器就可以假定一个值在使用过程中没有被修改,它就可以试着优化代码。 * * * * * 2.1 数据类型的意义 多字节的数据在内存中如何存放 78 56 34 12 12 34 56 78 高地址 高地址 低地址 低地址 int b = 0; 2.1 数据类型的意义 数据对齐的端模式(Endian) 与处理器有关,分为两种: 1. 小端对齐,将低位存放在低地址。 如Intel 80X86系列。 2. 大端对齐,将高位存放在低地址。 如PowerPC处理器。 例如,对于一个32位的数 0小端对齐: 78 56

您可能关注的文档

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档