1. 内联函数

1.1 概念

举个例子:

inline 修饰的函数叫做内联函数,编译时 C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

如果在上述函数前增加 inline 关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

查看方式:

1. 在 release 模式下,查看编译器生成的汇编代码中是否存在 call Add

2.在 debug 模式下,需要对编译器进行设置,否则不会展开(因为 debug 模式下,编译器默认不会对代码进行优化,以下给出 vs2013 的设置方式)

内联函数会在调用它的地方展开,导致这个函数没有地址,而其他文件如果要调用这个函数就需要链接它。但是它又没有地址,所以要调用内联声明和定义就不要分离,或者删掉内联关键字;

1.2 特性

1.inline 是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

2. inline 对于编译器而言只是一个建议,不同编译器关于 inline 实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用 inline 修饰,否则编译器会忽略 inline 特性。下图为《C++prime》第五版关于 inline 的建议:

函数代码太多内联不会展开

3.inline 不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开,就没有函数地址了,链接就会找不到。

// F.h 
#include <iostream> 
using namespace std; 
inline void f(int i); 
// F.cpp 
#include "F.h" 
void f(int i) 
{ 
    cout << i << endl; 
} 
// main.cpp 
#include "F.h" 
int main() 
{ 
    f(10); 
 
    return 0; 
} 
    // 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl  
    f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用

【面试题】

宏的优缺点?

优点:

1.增强代码的复用性。

2.提高性能。

缺点:

1.不方便调试宏。(因为预编译阶段进行了替换)

2.导致代码可读性差,可维护性差,容易误用。

3.没有类型安全的检查 。

C++有哪些技术替代宏

1. 常量定义 换用 const enum

2. 短小函数定义 换用内联函数

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐