- 1.1类中内联
- 1.2虚函数与内联函数
参考C++那些事-光城大佬的网站
参考理解 C++ 中的头文件和源文件的作用
上一篇C++基础复习提升-this那些事
下一篇C++基础复习提升-sizeof那些事
// inline.h文件用于定义类 // .h文件存放声明函数,.h文件不需要编译,在.cpp文件中使用宏命令#include将其包含进.cpp文件中即可 class A { public: // 声明不能使用inline修饰,要成为内联函数,必须在定义处加inline关键字 void f1(int x); static int foo(int x, int y); };
//main文件 #include#include "inline.h" using namespace std; //函数定义 inline int A::foo(int x, int y) { return x + y; } inline void A::f1(int x) {} int main() { A a; // inline函数调用点处 cout << a.foo(1, 2) << endl; } // 编译器对inline函数的处理步骤 // 将inline函数体复制到inline函数调用点处 // 为所用inline函数中的局部变量分配内存空间 // 将inline函数的输入参数和返回值映射到调用方法的局部变量空间中 // 若inline函数有多个返回点,将其转变为inline函数代码块末尾的分支
内联能提高函数效率,但并不是所有的函数都能定义成内联函数,内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。
(1) 若执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收货会更少。(2) 若每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。
以下情况不宜用内联:
(1) 若函数体内的代码比较长,使用内联导致内存消耗代价比较高,比如超过10行代码。
(2) 若函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
1.在非多态的情况下,虚函数可以是内联函数
2.内联函数是编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态时,不可以内联
3.inline virtual唯一可以内联的时候是:编译器知道所调用的对象是哪个类的,这只有在编译器具有实际对象的时候才能发生,若是对象的指针或者对象的引用时不会发生
4.构造函数不能是虚函数,因为构造函数的一个重要使命,就是记录虚函数表,因此,在建立好虚函数表之前,虚函数的功能是不存在的。
//inline.h文件 #ifndef IMPLEMENT_CLS class A { public: // 类内声明定义的成员函数都是隐式内联函数 virtual ~A(); // 内联函数的声明定义都写在头文件里 inline virtual void testA() { std::cout << "A test" << std::endl; }; }; class B : public A { public: void testA() { std::cout << "B test" << std::endl; }; virtual ~B(); }; #endif
//main文件 #include#include "inline.h" using namespace std; A::~A() { cout << "A destroy start!" << endl; } B::~B() { cout << "B destroy start!" << endl; } int main() { // 在编译器时能够知道是具体哪个对象调用的虚函数可以为内联函数 A a; a.testA(); // 通过指针或者对象引用调用的虚函数(也就是多态的情况), // 需要在运行时才能确定是哪个对象调用,所以不能为内联函数 A *b = new B(); b->testA(); // 释放堆内存的new的指针,先调用子类虚析构再调用父类虚析构(这里顺序和构造函数相反) delete b; b = nullptr; return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)