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