深入探索C++对象模型 第六章 执行语义学

来源:互联网 发布:考研作文怎么准备 知乎 编辑:程序博客网 时间:2024/05/10 13:24

1.        一个区段可能有多个return离开点,所以可能导致一些对象创建后,没有用就需要释放,这就造成了很多浪费。所以建议把object放置在使用它的区段的附近。

2.        C++中全局变量会放置在datasegment,如果没有被指定值,内置类型其所被配置的内存内容将会被置为0。(会被初始化),而局部变量则不会。类类型的话,应该提供一个默认构造函数,否则就失败了。

3.        局部静态变量的初始化只执行一次,并且析构函数也只执行一次。

4.        对象数组Point arr[],如果没有默认构造函数或者无参构造函数,则数组定义将会失败。要对每个对象执行构造函数。函数模型

Void *Vec_new(void *arr,size_t elem_size,int elem_count,void(*constructor)(void*),void (*destructor)(void*,char))。Vec_new 主要做的是将构造函数实施于每个元素中。

5.        使用new运算符时,内置类型int *p=new int(5)需要两个步骤:1、配置所需的内存,2、将配置得来的对象进行赋值。。类类型则需要先申请再进行初始化(调用构造函数)。

New 数组的时候,对于内置类型并不会真的调用vec_new(),而类类型则vec_new()函数来调用构造函数。

6.        Placement  new:特指含有一个void*(是一个任意类型的指针)参数的new版本。有两件事情要做:将对象放到void*指向的地址,调用构造函数。返回为一个指针。

7.        对于基类、子类数组的问题。如果用基类类型的指针来生成子类,

eg: base *arr=new derived[10];arr数组中基类和子类的构造函数都要调用。但在delete的时候,只调用了基类的析构函数。这完全不是好主意。。

8.        对于临时性对象,许多编译器会产生临时性对象进行临时结果的存储。而临时对象的生命规则是需要的时候它应该存在,不需要了应该尽快销毁。所以就引出了临时性对象的生命规则的两个例外:1、表达式用来初始化一个对象,只有对象的初始化完成了临时对象(用来存储表达式结果)才可以被销毁。2、一个临时对象被绑定于一个reference,对象将残留,直到reference生命结束才可以,因为他是一个别名,否则reference没有意义了。Eg:const String &space=” ”,编译器将会产生以下代码:String  temp;temp.String::String(“ ”);constString &space=temp。这个temp就是一个临时对象。。但对于内置类型应该就不产生了吧。。

9.        临时对象的存在,是由于编译器产生的,可能会使代码的效率较低。但通过将个别成员,变量放置在register(寄存器)中、或者通过反聚合方法来提高效率。

                            

0 0
原创粉丝点击