C/C++内联函数

参考链接:

  1. C/C++内联函数
  2. C++类里面的哪些成员函数是内联函数?

解析

内联 inline 是个修饰符,用来修饰体积不大又调用频繁的函数,可以减小函数调用的开销。

所谓减小开销,就是在编译时把函数体的代码嵌入进去,达到和宏类似的效果,这样程序在运行到该函数时,就不需要在频繁的跳转中消耗栈的空间

从经验上来说,函数体在10行以内,执行逻辑极其简单(写值,简单的判断和计算等),调用又十分频繁,尤其是一些工程代码中会放在周期循环里一直跑的,联系到其它模块的函数,就可以写成内联函数。

格式:inline + <函数头>

在函数头前面加上个inline就行,但有一点要注意,inline修饰的函数要当场给出其原型。inline只是修饰符,不能用作声明。

下面写法是不允许的:

inline int max(int a,int b);

int max(int a,int b)
{
    //......
}

下面写法是允许的:

int max(int a,int b);

inline int max(int a,int b)
{
    //......
}

内联函数无法使用for,while,switch语句。

慎用内敛函数,除非它足够简单。最好把它们统一写到一个头文件里使用。

内联函数的优缺点

  • 优点:避免函数调用时的额外开销
  • 缺点:由于内联函数的函数体在代码段中会出现多个“副本”,因此会增加代码段的空间。
  • 本质:以牺牲代码段空间为代价,提高程序的运行时间的效率。
  • 适用场景:函数体很“小”,且被“频繁”调用。

和宏有什么区别?

  1. 内联函数在运行时可调试,而宏定义不可以;
  2. 编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
  3. 内联函数可以访问类的成员变量,宏定义则不能;
  4. 在类中声明同时定义的成员函数,自动转化为内联函数。

C++类中哪些成员函数是内联函数?

1. 隐式内联:定义在类里面是隐式内联函数

class Person
{
public:
	Person(const string &name)
	{
		Name = name;
	}
    void printName()//printName 定义在类里面是隐式内联函数
	{
		cout << Name << endl;
	}
private:
	string Name;
};

2. 在类里面显示声明,在类外面定义

class Person
{
public:
	Person(const string &name)
	{
		Name = name;
	}
    inline void printName();//成员被函数前加了inline是显式内联函数
	//在类里面显式声明
private:
	string Name;
};
void Person::printName()
{//在类外面定义
	cout << Name << endl;
}

3. “追加”内联:表示在类里面没有显式声明,在类外显示定义了内联

class Person
{
public:
	Person(const string &name)
	{
		Name = name;
	}
    void printName();
	//在类里面没有显式声明
private:
	string Name;
};
inline void Person::printName()//成员被函数前加了inline是显式内联函数
{//在类外面显式定义
	cout << Name << endl;
}

常见的成员函数不是内联函数定义不再类里面,且声明和定义都没有inline.

上一篇:LG P4148 简单题


下一篇:hdu7107 GCD on Sequence