内联函数(inline function)那些事
内联函数(inline)
内联函数对于一般的人来说,没什么可讲的,就那么回事(反正就有那种说不清的感觉)。有这种想法的人似乎和我一样都是菜鸟级别的吧!
今天看到一个面试题:
讲一下内联函数的含义:(面试题)
将以下代码改为C语言代码,要求在.c文件中能编译通过(要提交.c文件)
/*
将以下代码改为C语言代码,要求在.c文件中能编译通过(要提交.c文件)
*/
#include<iostream>
using namespace std;
inline float max(float c1, float c2)
{
return c1 > c2 ? c1 : c2;
}
int main()
{
cout << "请输入2个浮点数:";
float c1 = 0.0f;
float c2 = 0.0f;
cin >> c1 >> c2;
cout << max(c1, c2) << endl;
return 0;
}
呃呃这要怎么讲???从哪里讲,脑子里有东西,但是说不清。(在我这里说不清就是不会)
因此再一次学习inline函数,到网上查资料,有收获。
【参考:内联函数*】
在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。
接下来就从*的定义中找到答案。
1)内联函数(有时称作在线函数或编译时期展开函数)
这句话的信息量非常大,首先内联函数就是编译时期展开函数。(他说出了内联函数的作用时机,以及他的作用形式)
作用时机---------------------------------编译时。
作用形式--------------------------------展开函数(将函数展开)。
注意:编译原理
创建一个可执行的目标程序:一般分为经历一下4个过程。
2)也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方
内联实质--------------------------------函数替换。
注意:
建议-------------------------------------虽然程序员将函数申请为Inline函数,但是是否真正成为inline函数,不一定。
函数体----------------------------------上面提到的是将函数体插入到调用该函数的地方,是函数体,体体体,重要的事情说三遍。
3)c++引入内联函数的目的
节省了每次调用函数带来的额外时间开支。
4)尽量用inline、const、enum替换 #define
尽量用编译器替换预处理。
a)#define宏预处理阶段进行粗暴替换,不进行语法检查,而inline函数是在编译器阶段进行的替换,接受语法,语义的检查。相对更安全。#define 的错误一般很难最查到。
总结:通过以上对内联函数(inline function)的讲解,是否心中已经有了上面面试提的答案了呢。
#include<iostream>
using namespace std;
//inline float max(float c1, float c2)
//{
// return c1 > c2 ? c1 : c2;
//}
#define max(x,y) (x > y ? x : y)
int main()
{
cout << "请输入2个浮点数:";
float c1 = 0.0f;
float c2 = 0.0f;
cin >> c1 >> c2;
cout << max(c1, c2) << endl;
return 0;
}
推荐阅读
-
【转】Kotlin的inline内联函数
-
C++程序员应了解的那些事(47)函数之 传入传出参数 / 默认参数
-
C++程序员应了解的那些事(36)Effective STL第6条:当心C++编译器中最烦人的分析机制 --- 调用构造函数被误认为是函数声明的问题
-
C++程序员应了解的那些事(63)STL内建函数对象、仿函数
-
C++程序员应了解的那些事(62)~ list::splice()函数详解
-
C++程序员应了解的那些事(98)C++构造函数小结
-
C++程序员应了解的那些事(38)substr()函数用法详解
-
C++ inline内联函数详解
-
C++之内联函数inline的使用解析
-
php递归函数递归复制与删除目录的那些事