《c++程序性能优化》——c++中语言特性中的性能分析

第三章 c++中语言特性中的性能分析

 

1构造函数和析构函数

调用构造函数的顺序

(1)递归从父类对象开始

(2)然后是成员变量

(3)执行函数构造函数堆和函数体

 

创建对象一般有两个方式

(1)从线程的栈中创建,也成为局部对象

  {

   .....

   Object obj;

   .....

  }

(2)从全局堆里创建。

  {

   .....

   Object* obj=new Object;

   .....

   delete obj;

   .....

   }

 

  2继承和虚拟函数

     怎样写动态绑定的继承体系。

      (1)基类抽象的通用的数据和操作。如果数据成员在各个派生类都用到,那么定义在基类,如果操作多各个派生类都有意义,无论是福被修改或扩展。都要将其定义在基类中。

      (2)有些操作,如果对于各个派生类而言语义保持一致,无需扩展,那么就是基类的非虚拟成员函数。

      (3)对于有些操作,虽然对于派生类都有意义,但语义不相同,这些就是基类的虚拟成员函数。

     虚拟函数实际上是“运行期”行为,本质上“编译期”无法知道某个虚拟函数调用在真正执行的时候会用到哪个具体实现,因此不会内联话。也就是说如用了动态绑定,就必须放弃内联函数。

   3临时对象

  临时对象是c++语言中未出现在源代码中,而是在堆栈中产生未命名对象。产生一般有下列两种场合:

(1)当实际调用函数时传入的参数与函数定义中声明的变量类型不匹配,

   class Rational{

      Rational(int a=0,int b=1):m(a),n(b){}

      private:

      int m;

      int n;

  };

void foo()

{

 Rantional r;

 r=100;

}

当r=100赋值时,根据构造函数,生成临时对象;

   如果不想生成,用关键字expicit

    C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。
    C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。

 

(2)当函数返回一个对象时。

 

4 内联函数

内联函数的引入时为了性能考虑的。

编译器并不总尊重inline关键字。inline只是给编译器一个建议。

他和macro的区别是,内联是编译期的行为,而宏的预处理期行为。

最后,一个程序的入口main()肯定不会被内联,另外,编译器合成的默认构造函数,拷贝构造函数,析构函数,和赋值构造运算符一般都会被内联化。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值