2012年3月47初始化和赋值对复杂数据类型的对象,初始化操作也可能很复杂初始化操作需要把对象设置到合法的初始状态,保证程序安全在定义/使用对象处反复写细节,很容易出错(赋值的情况类似)方便使用的抽象很有价值C++语言引入了程序员定义的初始化和赋值的概念解决这类问题的一个很好的想法(需要重载功能的支持)初始化和赋值是意义不同的操作在赋值时应认为被赋值对象已经有值,因此可能需要对原值做适当处理而初始化总是对新建的对象进行C++特别细致地考虑了初始化与赋值之间的差异,允许程序员为类的这两个操作定义不同的动作,很有道理2012年3月48赋值赋值是常规语言里最重要最基本的操作,但赋值的意义是什么值语义模型下的赋值的效果是值的复制(拷贝).
.
.
.
.
34xyx:=y3434xy赋值改变变量的值约束.
在x:=.
.
.
y.
.
.
中左边(一般而言是表达式)指称被赋值对象,通常确定一个位置.
允许放在赋值符左边的表达式称为左值表达式赋值符右边的表达式表示一个可以赋的值,这种值称为右值有些表达式同时可以表示左值和右值,放在赋值符号左边时取其左值,放在右边就取其右值(例如变量名x,表达式a[i],c.
m等)在值语义(值模型)和引用语义(引用模型)里,赋值的意义不同2012年3月49赋值引用语义下赋值是引用的复制,结果是值的共享.
.
.
.
.
34xyx:=y.
.
.
.
.
34xy注意这里有两个现象:变量的值是另一对象,赋值导致不同变量以同一对象为值赋值使x原来引用的对象(值对象)现在丧失了来自x的引用在采用引用语义的语言里,如果变量出现在表达式里,在需要使用被引用对象的值时,(编译后的)程序将自动做间接操作(dereference)值对象变量a1,2,3例:如果a是Java的数组变量(a的值是数组),可以直接写a[2].
想想a[2]的意思2012年3月50变量的语义模型不同语言采用了不同的变量语义模型.
例如:C:彻底的值语义,变量的所有属性都是静态的,只供编译时使用名字值Java:基本类型的变量采用值语义,无动态属性信息对象类型变量采用引用语义,值对象约束了部分属性信息名字值名字值Perl等一些脚本语言:引用语义,值对象包含所有类型信息Lisp:类似变量的实体称为符号,属性关联关系见图.
值对象本身有自己的属性约束值name.
.
.
其他属性名字…2012年3月51引用变量和引用参数一些语言提供了引用变量,例如C++:intn=1,&m=n;许多语言里的函数/过程可以有引用参数,例如:intfun(int&n,C++procedureproc(varn:integer,Pascal引用变量定义应看作给一个对象的另一个名字:nm使用m等同于使用nn和m是同一对象的不同名字没有对引用变量本身的操作,只能通过它去操作被引用的对象引用参数(变量参数)就是在函数里为实参(必须是程序对象)建立一个局部的名字,通过这个名字可以直接访问实参对象(可能是个变量)2012年3月52指针变量指针变量是以变量(对象)标识为值的变量(由于常以变量的内存地址作为其标识,所以常说指针变量以"地址"为值.
也有其他情况)引进指针变量,使地址变成了可以操作的数据(可用于赋值等)int*p=newint(35);//C++的写法p35理解指针变量,一个关键问题是分清是对指针变量本身的操作还是对被指对象的操作.
指针变量的dereference(间接,取被指)需要在程序里明确描述,以区分两种不同操作(两种情况都可能作为左值或右值)C语言用p和*p区分这两种情况,Pascal用p和p^区分两种情况指针很像引用,但其本身也可以操作.
值语义的语言里用"指针"模拟引用语义,支持动态存储管理,建立复杂数据结构.
早期语言(Fortran,Algol等)没有指针.
采用引用语义的语言可以没有指针(如Java)2012年3月53别名如果与一个对象约束的名字多于一个,就是出现了别名(alias)出现别名时,程序正文中看起来不同的名字实际引用着同一个对象别名使程序理解更加困难,人或系统(如编译器)更难推断程序的行为(难做分析和优化),也大大增加了为程序建立严格语义理论的难度一些情况:局部参数与全局变量成为别名intm;voidf(int&n){n++;m+=n*n;}.
.
m=3;f(m);.
.
.
不同的引用参数相互成为别名voidg(int&a,int&b){b=a+3;a+=5;}.
.
.
g(m,m);.
.
.
一些语言设计者认为别名是万恶之源,Euclid语言(1977-1978年)的主要设计目标之一是通过静态检查禁止别名别名分析在编译中有重要作用2012年3月54别名一类重要"别名"问题是数组元素引用,如a[i]=a[j]+a[k];其中a[i]、a[j]、a[k]也可以看作对象的名字,它们是否表示同一个元素的问题完全是动态确定的,仅用静态检查不可能完全确定广义的,别名是源程序里的两个不同对象描述,在运行中某个时刻实际指称同一个对象,或者说,同一对象可以通过不同的描述形式访问C++的引用变量就是引进别名可以认为指针也是引进别名的机制,例如int*p=newint(3);int*q=p;.
.
.
.
.
.
*q=4;cout<<*p;这里看不到赋值会影响与p有关的环境情况2012年3月55别名引用语义中的赋值结果是值共享,导致别名:int[]a={1,2,3};int[]b=a;int[]c={3,4,5,6};c3,4,5,6a1,2,3b赋值a[1]=8;将使b[1]的值也变成8赋值a=c;导致a引用c的值,b不变c3,4,5,6a1,8,3b在引用语义中,如果需要避免值共享,就必须做值对象本身的拷贝.
例如在Java里需要写a=(int[])c.
clone();2012年3月56别名由指针而产生的值共享(和别名)的情况很常见,而且很有用很多时候需要值共享,例如建立链接队列,遍历一个链表(指针值共享)headtailpq指针值共享是别名的一种典型情况,在采用值语义的语言里不可避免.
在采用引用语义的语言里,复杂数据结构里也广泛存在别名的情况问题:当从一个指针(或引用)找到一个对象时,一般无法知道有没有指向这个对象的其他指针(除非程序员头脑中有非常清晰的编程模型)在操作复杂数据结构时,指针间的链接关系可能导致非常复杂的别名局面,这可能给存储管理带来很大困难.
下面会看到这种情况的影响2012年3月57悬空引用悬空引用(danglingreference):程序执行中的某个时刻,处于活动状态的指针变量或引用变量没有引用到合法的对象px出现悬空引用的情况:T*p;.
.
.
p=(T*)malloc(sizeof(T));.
.
.
free(p);.
.
.
*p.
.
.
//危险!
{Tn=.
.
.
;p=&n;//p生存期比n长}.
.
.
*p.
.
.
//危险!
T*fun(.
.
.
){Tn;.
.
.
return&n;}T*p=fun(.
.
.
);.
.
*p.
.
//危险!
}出现后两种情况,都因为可以取地址2012年3月58悬空引用悬空引用是程序中的极端危险状态从悬空引用出发间接读取,得到的是非法数据对悬空引用间接赋值,可能造成无法预计的破坏定义后没有初始化的指针变量也处于悬空状态,如C:全局指针自动设置为空,间接访问这种指针通常会引发操作系统异常局部指针不自动初始化,处于非法状态,间接访问可能引发操作系统异常,或导致难检查的错误(如修改不明数据,甚至系统数据结构)这也是一些语言提供变量自动初始化机制的重要原因通过语言设计可以防止一些悬空引用(不能完全避免).
例如:多数语言里没有取地址操作,因此不存在由于生存期导致的悬空引用禁止把生存期短的对象的地址赋给生存期长的指针,可减少悬空引用2012年3月59悬空引用与废料(垃圾)产生悬空引用的最大问题是复杂数据结构里的值共享:其中可能出现多个指针或者引用实际上关联于同一个对象的情况pqp:=qpq给p赋值前能不能释放p原来指向的对象如果存在引用同一对象的其他指针,释放就会造成悬空的引用如果不存在引用同一对象的其他指针,不释放就会造成一块实际上已经无法在程序里使用的存储丢失了(产生了废料)(两难)产生废料的结果是可能使长期运行的系统由于空间"耗尽"而被迫终止可采用一些编程规则管理存储,但这仍是复杂系统实现中的巨大负担2012年3月60废料为防止悬空引用,一些语言根本不提供delete/release/free一类操作如果没有存储释放操作,悬空引用问题就只剩下"空指针间接",而"空指针"是明确的状态,可在程序里检测(非空指针悬空无法检测)废料(garbage,垃圾):丧失了引用途径,已经不可能在程序里访问,但仍然占据着存储,没有释放的"死对象"在基于值语义并有指针机制的语言里,由于程序员工作不当或疏忽,或由于情况复杂不能确认操作正确而不敢释放,都可能产生废料在引用语义的语言里所有赋值都是修改引用,要求程序员去确认某个操作将使对象丢掉所有引用,对编程是巨大负担,实际上根本做不到人们开发了一些防止废料产生的技术:C++把堆对象关联于存在期明确的对象(栈对象),基于后者,通过自动执行的销毁动作(析构函数)释放动态分配的对象引用计数技术,运行中维护对每个堆对象的引用数,计数为0时释放2012年3月61堆区的分配与释放(理想状态)用户程序动态存储管理器自由空间工作空间静态区、栈区和寄存器释放申请和分配程序运行中,堆区分为自由空间(未使用的空闲空间)和工作空间两部分随着存储申请和释放,存储块在两个区之间移动(对象创建和销毁).
理想情况是完美的释放:工作空间中每个对象都存在访问路径,无废料2012年3月62废料和废料收集用户程序动态存储管理器自由空间工作空间静态区、栈区和寄存器释放申请和分配废料随着程序运行,有些堆对象可能丧失所有的访问路径,成为废料废料收集废料收集(garbagecollection,GC,垃圾回收)是程序运行环境里提供一种自动机制,它能自动识别废料,并把它们送回自由空间2012年3月63废料收集(GC)废料收集技术起源于Lisp,最早由McCarthy等为实现Lisp而开发废料收集的主要技术:标记-清扫:通过引用关系标出工作空间中全部活对象,收集其余对象复制式:把活对象及其连接关系复制到另一存储区,原区全部收回分代式:复制式的改进,利用对象的生存特性提高GC效率GC一直受到实际程序员的排斥,认为其时空开销太大,可能导致程序执行中无法预期(时刻/长短)的停顿.
典型:C++设计者很反对废料收集近年来,由于:处理器速度提高,内存扩大,废料收集的开销已经不是大问题在系统开发中完美地管理存储,已经成为程序员最大的负担之一OO的广泛应用,没有废料收集,开发OO程序的代价会大大提高最新的程序语言都提供了自动废料收集(Java,C#,各种新脚本语言)2012年3月64变量的值模型和引用模型(总结)对变量的值模型和引用模型的总结值保存在变量的存储区里,实现简单,易使用,易理解变量的值实际用另一个值对象表示,实现复杂,需要复杂的存储管理技术的支持;概念的理解也比较困难值可以直接访问,效率高(因此被大多数常规语言采用)需要多做一次间接访问,效率有所降低赋值是值的拷贝,语义清晰,易于理解;但对于大对象可能费时赋值是引用共享,语义较复杂,编程要当心;只修改引用,效率高存储管理方便,可根据变量的作用域,利用栈机制统一进行管理,存储管理简单,管理开销小由于值对象的创建和销毁,复杂的相互引用关系,必须有堆存储管理的支持和废料收集,管理复杂,开销大2012年3月65变量的值模型和引用模型需要静态确定变量类型,静态完成存储的分配或安排(如自动变量).
需要变量的类型声明和静态处理.
带来高的执行效率;但难支持动态确定大小的数组和其他具有动态性质的数据结构,包括字符串等变量可以无类型(通用的变量),许多特征可以不必(不)静态确定.
可能带来一些运行时开销;可自然支持动态改变大小的数组和字符串等需要另提供动态存储分配和指针概念,以支持动态数据结构、OO等高级技术.
指针是比引用更危险更难用的机制,是程序错误的重要根源能方便自然地支持各种高级程序设计技术,包括动态数据结构,面向对象的程序设计等等,不需要另外的指针概念在值模型语言的实现里,对某些特殊数据对象,需要在内部采用引用模式实现,例如,动态数组/字符串等.
(这是不得已而为之,必须的)在引用模型语言的实现里,为提高效率,基本类型(如各种数值)常采用值方式实现.
(只是为了提高效率,不是必须的)
简介华圣云 HuaSaint是阿里云国际版一级分销商(诚招募二级代理),专业为全球企业客户与个人开发者提供阿里云国际版开户注册、认证、充值等服务,通过HuaSaint开通阿里云国际版只需要一个邮箱,不需要PayPal信用卡,不需要买海外电话卡,绝对的零门槛,零风险官方网站:www.huasaint.com企业名:huaSaint Tech Limited阿里云国际版都有什么优势?阿里云国际版的产品...
提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...
速云怎么样?速云,国人商家,提供广州移动、深圳移动、广州茂名联通、香港hkt等VDS和独立服务器。现在暑期限时特惠,力度大。广州移动/深圳移动/广东联通/香港HKT等9折优惠,最低月付9元;暑期特惠,带宽、流量翻倍,深港mplc免费试用!点击进入:速云官方网站地址速云优惠码:全场9折优惠码:summer速云优惠活动:活动期间,所有地区所有配置可享受9折优惠,深圳/广州地区流量计费VDS可选择流量翻...
内存地址为你推荐
域名注册网有没有免费的网站域名注册?虚拟主机代理谁给推荐个好的虚拟主机无限级代理海外域名外贸网站如何选择合适的海外域名?手机网站空间手机登陆qq空间网址是什么?香港虚拟主机虚拟主机大陆的还是香港的好?1g虚拟主机打算买个1G的虚拟主机,用来做什么好?新加坡虚拟主机如何购买godaddy的新加坡主机?厦门虚拟主机我想用我自己的电脑做虚拟主机怎么弄啊华众虚拟主机管理系统华众虚拟主机管理系统请问。华众 虚拟主机管理系统 这个问题 怎么解决 。就是后台可以开通虚拟主机 没有问题,但是 删除虚拟主机 后台显示删除成功的,但是实际在服务器上 文件夹 ftp iis站点 都没有被删除 是什么问题域名网站域名和网址一样吗?
idc测评网 gitcafe 360抢票助手 2017年万圣节 网站被封 英文站群 网站挂马检测工具 河南m值兑换 息壤代理 流媒体加速 域名dns 512mb 万网主机管理 太原联通测速 贵阳电信测速 服务器防火墙 hostease google搜索打不开 windowsserver2008r2 nic 更多