一、内联函数
1.1内联函数的定义
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
call指令表明Add函数在被调用的时候建立了栈帧。如果在上述函数前增加inline关键字将其改为内联函数,在编译期间编译器会用函数体替换函数的调用。
1.2内联函数的特性
1.2.1优点
咋一看,内联函数与宏定义的作用好像很相似,他们的功能确实相似,但是内联函数克服了宏定义的一些缺点。首先,内联函数克服了宏定义不可调试的缺点,内联函数可以通过调试进到函数体的内部观察函数体中代码的逻辑运行。再一个,内联函数函数体内的写法跟一般函数没有任何区别,因此,内联函数克服了宏定义代码可读性差、维护性差、没有安全类型检查等等缺点。加上内联函数少了栈帧的开销,一定程度上提高了程序的运行效率。
1.2.2缺点
inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段会用函数体替换函数调用,但这种做法的缺陷就是可能会使目标文件变大,导致文件在网络传输的过程中传输速度变慢,(有一个例子就是用户在下载软件的时候文件会很大,导致下载时间很长)导致用户体验降低,这是很不利的影响。
1.2.3使用方式说明
鉴于内联函数的缺点,因此类中的函数在定义的时候短小的函数(一般不超过十行)可以考虑定义为内联函数,代码量大的函数就不要定义成内联函数了。但我们其实也不必担心,因为现在的编译器已经十分的“聪明”了。lnline说明只是向编译器发出的一个请求,是否将函数定义为内联函数还是取决于编译器自己的判断。
需要着重注意的是:内联函数不要声明和定义分离,分离会导致链接错误。因为inline被展开就没有函数地址了,链接就会找不到。
二、类和对象中值得注意的一些小点
1.在C++中,类型就是类名,在定义变量时变量名前不需要加struct
2.struct默认访问限定符为public,class默认访问限定符为private。
3.默认直接在类中定义的函数就是inline(但实际上取决于编译器)。
正确的用法:短小的函数直接在类中定义,长的函数声明和定义分离。
4.C++中实例出来的对象的大小只需要考虑成员变量的大小和内存对齐,成员函数属于类,成员函数的地址存储在公共代码区。
从上面的代码可以看到,类实例化出来的对象大小只包含了成员变量的大小,当然也会涉及内存对齐 (内存对齐在前面的博客中已有详细介绍),不包含成员函数的大小。
5.无成员变量的类,对象大小开一个字节,不存储有效数据,用来标识这个对象存在过
6.成员函数的参数会隐式的多一个类类型的this指针,this指针指向创建出来的对象的首地址。
this指针本质是一个形参,存在栈区上。不能够显式地传this指针,否则会报编译错误。
7.默认构造函数注意点:内置数据类型不处理(int,double......),自定义类型会去调用它的默认构造函数,如果自定义类型没有默认构造函数,会报编译错误。
一般情况下,我们都要自己写构造函数
成员都是自定义类型,或者声明时给了缺省值,可以考虑让编译器自己生成构造函数
8.默认析构函数
默认生成的析构函数,行为跟构造类似
内置类型成员不做处理,自定义类型成员会去调用它的析构函数