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

本文深入探讨了C++中对象管理的关键概念,包括局部静态变量的生命周期,全局变量与局部变量的区别,对象数组的初始化方式,以及placement new的使用场景。同时,文章还分析了临时对象的生命周期管理,提供了提升效率的方法。通过理解这些核心内容,开发者能够更有效地进行资源管理,优化代码性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(寄存器)中、或者通过反聚合方法来提高效率。

                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值