【C++】内联函数

内联函数的概念

以inline修饰的函数叫做内联函数,内联函数类似于宏,都是在调用的地方展开,没有函数调用建立栈帧的开销,提升程序运行的效率
不同的是宏是在预处理阶段展开的,而内联函数是在编译阶段展开的
而且宏使用起来过于繁琐,不够便捷,因此产生了内联函数

inline是一种空间换时间的做法,若大量使用内敛,整个代码将会变得臃肿,但却少了调用开销,能够提高程序运行效率。
内联对于编译器来说只是一种建议,具体是否采用还是要看编译器策略

一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。

内联函数的用法

在函数前加上inline关键字

inline void test()
{
    cout << 456 << endl;
}

调用内联函数时正常调用即可

内联函数的注意事项

使用内联函数时应当避免声明和定义分离,因为内联函数会在调用的地方直接展开,而导致失去地址,因此在链接时声明将会找不到内联函数导致链接错误

有一个可能会使用到内联函数的场景:
当多个文件包含同一个头文件时,并且这个头文件中存在函数,当多个源文件包含这个头文件时,每个源文件都会生成一个定义,此时将会发生符号冲突导致链接错误

对于这个问题有三种解决方法:
1、声明和定义分离,当声明和定义分离时,由于多个文件只是知道符号的存在,但并不会定义,因此不会发生冲突

//head.hpp中的文件
#include
using namespace std;
void test();

//realize.cpp中的文件
#include"head.hpp"
void test()
{
	cout<<"This is a test function"<<endl;
}

//main.cpp中的文件
#include"head.hpp"
int main()
{
	test();
}

2、使用static关键字修饰,由于链接属性,只能在声明它们的文件中可见,不能被其他文件看到

//head.cpp中的文件
#include
using namespace std;
static void test()
{
	cout<<"This is a test function"<<endl;
} 
//这里直接进行使用即可

3、使用inline关键字修饰,由于编译器会尝试将函数调用替换为函数体本身。但如果内联函数的声明和定义分离,在调用该函数的源文件中,编译器可能只能看到函数声明,而看不到函数定义

//head.cpp中的文件
#include
using namespace std;
inline void test()
{
	cout<<"This is a test function"<<endl;
} 
//同static修饰的函数,同样直接使用即可

推荐大文件使用static修饰,小文件使用inline修饰

【面试题】

宏的优缺点?
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。
C++有哪些技术替代宏?
1、常量定义 换用const enum
2、短小函数定义 换用内联函数

你可能感兴趣的:(c++,开发语言)