C++之内联函数讲解

原创 2016年08月31日 14:46:38

一、内联函数的作用

1.内联函数在编译的时候将不进行函数调用,编译器将内联函数的代码粘贴在调用(形式上调用)处,可以提高效率

2.内联函数只能是代码很少很简单的函数,因为如果一个很大很复杂的函数即使设为内联,编译器也将自动设置该函数为非内联

二、小代码实现

1、频繁调用函数事列
//频繁调用一个小函数
#include<iostream>
using namespace std;

bool isnumber(char);            // 函数声明
//------------------------------------
int main()
{
    char c;
    while(cin>>c && c != '\n')     // 反复读入字符,若为回车便结束
       if(isnumber(c))
            cout<<"you entered a digit.\n";
         else
            cout<<"you entered a non-digit.\n";
}
//----------------------------------
bool isnumber(char ch)
{
    return ch>='0' && ch <= '9' ? 1 : 0;
}
截图:



2、修改1
所以函数调用的开销相对来说占的比重就大了。为了免去调用开销,提高效率,可将程序改写为:
<span style="font-size:14px;">// 将小函数“融化”在调用处
//====================
#include<iostream>
using namespace std;
//------------------------------------
int main()
{
    char c;
    while(cin>>c && c!= '\n')
        if(c >= '0' && c <= '9' ?1 : 0) //将调用改为直接判断
        cout<<"you entered a digit.\n";
        else
            cout<<"you entered a non_digit.\n";
}</span>

3、设置内联函数

        上面的程序在if语句中用表达式替换了函数调用。在程序运行上,因为免去了大量的函数调用开销,提高了执行效率。

  由于isnumber函数比相应的表达式可读性好,所以若程序中多处出现isnumber,而又将其替换为复杂的实现语句的话,就会降低程序的可读性。我们既要用函数调用来体现其结构化和可读性,又要是效率尽可能地高。解决办法就是将这种小函数声明为内联(inline):


// 内联函数
#include<iostream>
using namespace std;

inline bool isnumber(char);        // 内联声明
//-----------------------------------
int main()
{
    char c;
    while(cin>>c && c != '\n')
        if(isnumber(c))
            cout<<"you entered a digit.\n";
        else
            cout<<"you entered a non_digit.\n";
}

bool isnumber(char ch)
{
    return ch >= '0' && ch <= '9' ? 1 : 0;
}
4、注意
       对函数的内联声明必须在调用之前。因为内联函数的代码在程序运行时是直接潜在调用处执行的,他不影响链接,只在编译时确定运行代码。因此编译时,在调用之前看到内联声明就是十分必要。

三、参考资料

1、内联函数
2、C++学习之路
版权声明:本文为博主原创文章,未经博主允许不得转载。

C++中类与对象的讲解(通俗易懂)

概念 描述 类成员函数 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 类访问修饰符 类成员可以被定义为 public...
  • liuwenhao1996
  • liuwenhao1996
  • 2017年02月28日 19:35
  • 641

C++模板剖析:函数模板、类模板解析

C++中关于模板&泛型编程问题:   问题引入:何编写一个通用加法函数?   (1)使用函数重载,针对每个所需相同行为的不同类型重新实现它 int Add(const int &_iLeft...
  • Sharp_UP
  • Sharp_UP
  • 2016年11月29日 21:36
  • 968

C++精髓之多态性与虚函数

面向对象程序设计中的多态性是指向不同的对象发送同一个消息,不同对象对应同一消息产生不同行为。在程序中消息就是调用函数,不同的行为就是指不同的实现方法,即执行不同的函数体。也可以这样说就是实现了“一个接...
  • yanghaitao_1990
  • yanghaitao_1990
  • 2016年06月04日 15:37
  • 321

C++变量属性小结

一个变量除了数据类型以外,还有3种属性: 存储类别 C++允许使用auto,static,register和extern 4种存储类别。 作用域指程序中可以引用该变量的区域。 存储期指变量在内存...
  • oqqQuZi1234567
  • oqqQuZi1234567
  • 2014年12月10日 17:02
  • 506

《Effective C++》学习笔记(三)

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38816913 闲谈 从北戴河旅游归来,该收心继续上班了,接下来将继...
  • sfh366958228
  • sfh366958228
  • 2014年08月25日 15:26
  • 596

海盗比酒量--蓝桥杯

简述 这是2012年蓝桥杯全国软件大赛预赛的第三题,情景是海盗喝酒,问题是每瓶酒后未倒下的人数。 推荐链接:《2012蓝桥杯软件大赛预赛题目汇总》 题目描述     有一群海盗(不多于20人),在船上...
  • milkcu
  • milkcu
  • 2013年04月25日 17:13
  • 1799

实例讲解C++ 双链表基本操作

1.概念   双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我...
  • whChina
  • whChina
  • 2016年04月26日 08:09
  • 1944

归并排序(视频+详解+代码)

归并排序 概述:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到...
  • dreamzuora
  • dreamzuora
  • 2016年10月16日 15:38
  • 908

C++ 类模板作为函数模板示例

类模板作为函数参数 函数的形参类型可以是类模板或类模板的引用,对应的实参 应该是该类模板实例化的模板类对象。 带有类模板参数的函数必须是函数模板。 #include using namespace s...
  • Slience_Perseverance
  • Slience_Perseverance
  • 2014年03月06日 17:20
  • 2772

深度解析C++模版

在C++发明阶段,C++之父Stroustrup和贝尔实验室的C++小组对原先的宏方法进行了修订,对其进行了简化并将它从预处理范围移入了编译器。这种新的代码替换装置被称为模板,而且它变现了完全不同的代...
  • imxiangzi
  • imxiangzi
  • 2015年12月11日 14:36
  • 812
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++之内联函数讲解
举报原因:
原因补充:

(最多只允许输入30个字)