【C++】什么是内联函数?虚函数可以声明为内联函数吗?

1、什么是内联函数?

  • 简单来说,内联函数就是在函数体前面声明为inline的函数,它的作用就是提高程序的效率。这主要是因为编译器会将内联函数直接插入到调用该函数的地方,由于是内嵌进去的,所以称为内联函数。通过这种方式,可以避免函数调用的开销和参数传递的开销,从而提高程序的执行效率。例如:
inline int add(int a, int b) {
    return a + b;
}
  • 内联函数通常有以下特点:

1)定义在class内的成员函数默认是inline函数(虚函数除外),不需要使用inline关键字进行显式声明。然而,对于较大或复杂的成员函数,即使在类内定义,编译器也可能选择不对其进行内联展开。
2)通常只有函数非常短小的时候(如10行代码内)才适合定义成inline函数,否则会导致程序变慢。
3)由于内联函数会直接内嵌到函数调用处,因此一定会增加可执行文件的大小,所以对于复杂的函数体或者频繁调用的函数,尤其是递归函数,内联展开可能会导致更大的代码量,造成代码膨胀的问题

2、虚函数可以声明为内联函数吗?

  • 虚函数一般来说不能声明为内联函数,因为内联函数是在编译时将函数内容替换到函数调用处的,是静态编译的。而当基类指针或引用来调用虚函数时,不能声明为inline,因为虚函数是在运行时动态调用的,编译器并不知道它绑定的是哪个对象,也就不知道该内联化哪个函数。例如:
class Base {
public:
	inline virtual void who() { cout << "I am Base\n"; }
};
class Derived :public Base {
public:
    //从语法上讲,这里可以写成inline,只是当基类指针调用派生类时,不能内联,编译器会自动忽略掉inline
	inline void who() { cout << "I am Derived\n"; }
};
int  main() {
	Base b;
	b.who();  //这里的who()是通过基类对象直接调用的,在编译期间就确定了,因此它可以是内联的
    
	Base *p = new Derived();
	p->who();  //通过基类的指针调用,在运行时才能确定,所以不能内联
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值