深入探索c对象模型

深入探索c对象模型

ID:35413675

大小:74.94 KB

页数:16页

时间:2019-03-24

深入探索c对象模型_第1页
深入探索c对象模型_第2页
深入探索c对象模型_第3页
深入探索c对象模型_第4页
深入探索c对象模型_第5页
资源描述:

《深入探索c对象模型》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、一.基本概念先来看看栈。栈,一般用于存放局部变量或对象,如我们在函数定义中用类似下面语句声明的对象:Typestack_object;stack.objcct便是一个栈对彖,它的生命期是从定义点开始,当所在函数返回时,生命结束。另外,儿乎所有的临时对象都是栈对象。比如,下面的函数定义:Typefun(Typeobject)这个函数至少产生两个临吋对象,首先,参数是按值传递的,所以会调用拷贝构造函数生成一个临时对aobjcct-copyl,在函数内部使用的不是使用的不是object,而是object_copyl,

2、自然,object_copyl是一个栈对象,它在函数返回时被释放;还有这个函数是值返回的,在圃数返回时,如果我们不考虑返回值优化(RV),那么也会产牛一个临时对象object_copy2,这个临时对象会在函数返回后一段时间内被释放。比如某个函数屮有如下代码:Typett,result;//生成两个栈对象tt=fun(tt);//函数返回时,生成的是一个临时对象object_copy2上面的第二个语句的执行情况是这样的,首先函数fun返回时生成一个临时对象object_copy2,然后再调用赋值运算符执行tt=

3、object_copy2;//调用赋值运算符看到了吗?编译器在我们毫无知觉的情况下,为我们生成了这么多临时对象,而生成这些临时对象的时间和空间的开销可能是很大的,所以,你也许明口了,为什么对于“大”对象最好用const引用传递代替按值进行函数参数传递了。接下来,看看堆。堆,又叫自由存储区,它是在程序执行的过程中动态分配的,所以它最大的特性就是动态性。在0+中,所有堆对象的创建和销毁都要由程序员负责,所以,如果处理不好,就会发生内存问题。如果分配了堆对彖,却忘记了释放,就会产生内存泄漏;而如果已释放了对象,却没有

4、将相应的指针置为NULL,该指针就是所谓的“悬挂指针”,再度使用此指针时,就会出现非法访问,严重时就导致程序崩溃。那么,C++中是怎样分配堆对象的?唯一的方法就是用new(当然,用类malloc指令也可获得C式堆内存),只要使用new,就会在堆屮分配一块内存,并且返回指向该堆对象的指针。再来看看静态存储区。所有的静态对象、全局对象都于静态存储区分配。关于全局对象,是在main()函数执行前就分配好了的。其实,在main()函数中的显示代码执行之前,会调用一个由编译器生成的_main()函数,而_main()函数

5、会进行所有全局对象的的构造及初始化工作。而在mainO函数结束之前,会调用由编译器生成的exil函数,来释放所有的全局对象。比如下面的代码:voidmain(void)■……//显式代码}实际上,被转化成这样:voidmain(void)■__.main();〃隐式代码,由编译器产生,用以构造所有全局对象……//显式代码••••••exit();//隐式代码,由编译器产生,用以释放所有全局对象所以,知道了这个之后,便可以由此引出一些技巧,女口,假设我们要在mainO函数执行之前做某些准备工作,那么我们可以将这些

6、准备工作写到一个自定义的全局对象的构造函数中,这样,在mainO函数的显式代码执行之前,这个全局对象的构造函数会被调用,执行预期的动作,这样就达到了我们的目的。刚才讲的是静态存储区屮的全局对象,那么,局部静态对象了?局部静态对象通常也是在函数中定义的,就像栈对象一样,只不过,其前而多了个static关键字。局部静态对象的生命期是从其所在函数第一次被调用,更确切地说,是当第一次执行到该静态对象的声明代码时,产牛该静态局部对象,直到整个程序结束时,才销毁该对象。还有一种静态对彖,那就是它作为class的静态成员。考

7、虑这种情况时,就牵涉了一些较复杂的问题。第一个问题是class的静态成员对象的生命期,class的静态成员对象随着第一个classobject的产牛而产牛,在整个程序结束时消亡。也就是有这样的情况存在,在程序中我们定义了一个class,该类中有一个静态对象作为成员,但是在程序执行过程屮,如果我们没有创建任何一个该classobject,那么也就不会产生该class所包含的那个静态对象。述有,如果创建了多个classobject,那么所有这些object都共享那个静态对象成员。第二个问题是,当出现下列情况时:cl

8、assBase{public:staticTypes_object}classDerivedl:publicBase//公共继承{//otherdata}classDerived2:publicBase//公共继承{//otherdata}Baseexample;Dcrivdelcxamplcl;Derivde2example2;example.s_object二examplel.s_

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。