C++的内联成员函数和内联函数

内联函数是C++的一种优化技术,用于减少程序执行时间。它在编译时将函数体插入到每个调用点,以避免函数调用的开销。内联函数通常用于小规模、频繁调用的函数,但并非所有声明为内联的函数都会被编译器内联处理,如虚函数和递归函数。在类定义中声明的成员函数默认为内联,使用inline关键字是建议而非强制。注意内联函数的使用需考虑代码大小和效率平衡,避免在内联函数中使用复杂的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、内联函数的定义:

2、内联函数的意义:

3、一般表达式:

4、使用内联函数的注意事项:

5、内联的方法

(1)、第一种情况,在类体内显示声明并定义:

(2)、第二种情况,在类体内声明(可选)在类体外inline定义:

(3)、第三种情况,是内联函数,但不是内联成员函数:

6、什么时候用内联(满足以下至少一条):   

7、举例:

8:结论:


1、内联函数的定义:

        内联函数,是编译器用来减少执行时间的一种优化技术。

        内联函数是C++的一个增强功能,可以减少程序的执行时间。函数可以通过指示编译器,使其成为内联函数,这样编译器就可以取代那些被调用的函数定义。编译器会在编译时替换内联函数的定义,而不是在运行时引用函数定义。(这只是建议编译器将函数内联,如果函数很大编译器可以忽略 "内联 "请求,将函数作为普通函数处理。)

        在类成员列表中定义的成员函数默认为内联成员函数,所以可以省略inline关键字。一般含有几行代码的成员函数通常被内联声明,或者说可以在类的定义中定义较短的函数。

2、内联函数的意义:

        对于内联函数,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换;

        而对于普通函数,都是在运行时候才被替代。这其实就是个空间代价换时间的例子。

3、一般表达式:

        要使任何函数成为内联函数,在函数声明或定义前使用关键字 "inline"。

4、使用内联函数的注意事项:

  • 使用inline定义的内联函数必须将类的声明和内联成员函数的定义都放在同一个文件中,否则编译时无法进行代码的置换;
  • 内联函数一般都是1-5行的小函数, 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用;
  • 不要在内联函数内使用循环语句和开关语句;
  • 有些函数即使声明为内联的也不一定会被编译器内联, 比如虚函数和递归函数就不会被正常内联
  • 递归函数不可以成为内联函数;

5、内联的方法

(1)、第一种情况,在类体内显示声明并定义:

class A
{
public:
  inline int add(int a, int b)
{
    return (a+b);
}
};

(2)、第二种情况,在类体内声明(可选)在类体外inline定义

class A
{
public:
  int add(int a, int b);
};
inline int A::add(int a, int b)
{
   return (a+b);
}

(3)、第三种情况,是内联函数,但不是内联成员函数:

inline int add_two (int a, int b)
{
   return (a+b);
}

6、什么时候用内联(满足以下至少一条):   

  • 函数体很短
  • 函数被多次调用

7、举例:

/*内联成员函数*/
#include<iostream>
using  namespace std;
class Tan
{
private:
	int age;
	char* name;
	char* sex;
public:
	inline void set(int age, char* name, char* sex);
	/*inline*/ void show();	//本例无特点:没有在用途上区分开有无关键字inline,即使逐行调试,现象也一样
};
inline void Tan::set(int age, char* name, char* sex)
{
	Tan::age = age;
	Tan::name = name;
	Tan::sex = sex;
}
/*inline*/ void Tan::show()
{
	cout << "姓名:" << name << endl << "年龄:" << age << endl << "性别:" << sex << endl;
}
int main()
{
	Tan tan1{};
	tan1.set(24, (char*)"老檀时代", (char*)"man");
	tan1.show();

	Tan tan2[3]{};
	tan2[0].set(24, (char*)"老檀时代0", (char*)"man");
	tan2[1].set(25, (char*)"老檀时代1", (char*)"man");
	tan2[2].set(26, (char*)"老檀时代2", (char*)"man");

	tan2[0].show();
	tan2[1].show();
	tan2[2].show();
	return 0;
}
/*运行结果:
姓名:老檀时代
年龄:24
性别:man
姓名:老檀时代0
年龄:24
性别:man
姓名:老檀时代1
年龄:25
性别:man
姓名:老檀时代2
年龄:26
性别:man	*/

8:结论:

普通函数函数调用时,复制实参去调用函数复制实参调用函数一定不会影响实参的值,即引用的函数执行后不会返回实参的当前值。如果想要影响实参的数值,需要引用实参的指针去调用函数多次调用函数会增加编译器的负担
内联函数用实参和函数体替换函数调用的操作用实参和函数体替换函数的调用一定影响实参的当前值。多次调用时使用内联函数会减少编译器的负担

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值