基本语言细节--《深度探索C++对象模型》--(6)Runtime Semantics-总结点

                             基本语言细节--《深度探索C++对象模型》--(6)Runtime Semantics-总结点

1.注意开篇所讲的编译器产生的代码,里边有很多临时性对象,应理解编译器在背后为我们做了什么!正如Lippman所讲,这是C++一件困难的事情,不太容易从程序源码中看出表达式的复杂度。

2.全局对象:

   C++程序中所有的的全局对象都被放在数据段,并且其值要么是由程序员显式指定的,要么是内存内容为0;

    具体步骤:

   1.编译器会为每一个需要静态初始化的文件,产生一个_sti()(sti,static initialization)函数,内含必要的构造函数或inline expansions. 

   2.编译器会为每一个需要静态内存释放的操作,产生一个_std()(static deallocation)函数,内含必要的析构函数或inline expansions.

   3.提供一组运行时库函数,一个_main()函数,用以调用可执行文件中的所有_sti()函数,以及一个exit()函数,用以调用所有的_std()函数。

3.指针所指向的new对象,会因delete而结束。然而后续若继续使用此指针,仍然是可以的!

4.new运算符实际上总是以C标准的malloc()完成,而delete也总是以标准C free()完成。

5.寻找数组的维度,对于delete运算符的效率会带来极大的影响,故而才导致了现在要想删除一个对象数组,需要程序员提供一个“[]”,否则,其只会析构第一个元素!

6.关于基类指针指向派生类对象数组的析构问题,书本上谈论的是避免这样做,而解决之道在于程序员层面,而不是语言层面,其实现实是,在VS2012的测试中,通过指向派生类对象数组的基类指针是可以正确调用子类的析构函数的,正确完成对象数组的析构工作!

7.临时性对象:

   (1).在某些环境中,由处理器产生临时性对象是有必要的,或是比较方便,如此临时性对象的由编译器来定义!

   (2).临时性对象的销毁,应该是对完整表达式求值过程中的最后一个步骤。

   (3).如果一个临时性对象被绑定在引用上,则对象将残留,直到被初始化的引用结束,或者直到临时对象的生命范畴结束-------视哪一种先到而定!


卧浪居士 于HUST2013.11.21

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值