C++基础复习提升-inline那些事

C++基础复习提升-inline那些事

参考C++那些事-光城大佬的网站
参考理解 C++ 中的头文件和源文件的作用
上一篇C++基础复习提升-this那些事
下一篇C++基础复习提升-sizeof那些事

1.1类中内联

// 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 <iostream>
#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虚函数与内联函数

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 <iostream>
#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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值