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

    技术2022-05-20  46

    第三章 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()肯定不会被内联,另外,编译器合成的默认构造函数,拷贝构造函数,析构函数,和赋值构造运算符一般都会被内联化。

     

     

     

     

     


    最新回复(0)