内联函数

转载自:http://www.cnblogs.com/socrassi/archive/2009/09/09/1563002.html

inline函数
我们看下面的函数,函数体中只有一行语句: 
    double Average(double total, int number){ 
      return total/number;
      } 
定义这么简单的函数有必要吗?实际上,它还是有一些优点的:第一,它使程序更可读;第二,它使这段代码可以重复使用。但是,它也有缺点:当它被频繁地调用的时候,由于调用函数的开销,会对应用程序的性能(时间+空间效率,这儿特指时间)有损失。例如,Average在一个循环语句中重复调用几千次,会降低程序的执行效率。


    那么,有办法避免函数调用的开销吗?对于上面的函数,我么可以把它定义为内联函数的形式:
    inline double Average(double total, int number){
      return total/number;
    }
函数的引入可以减少程序的目标代码,实现程序代码的共享。
函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护好现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但对于一些函数体代码很短,又被频繁调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。
    在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将内联函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。

◆总结:inline函数是提高运行时间效率,但却增加了空间开销。
       即inline函数目的是:为了提高函数的执行效率(速度)。
非内联函数调用有栈内存创建和释放的开销
在C中可以用宏代码提高执行效率,宏代码不是函数但使用起来像函数,编译器用复制宏代码的方式取代函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高速度。

◆使用宏的缺点:(1)容易出错(预处理器在复制宏代码时常常产生意想不到的边际效应)
                  例如:#define MAX(a,b)    (a) > (b) ? (a) : (b)
                        语句result = MAX(i,j) + 2 却被扩展为result = (i)>(j)?(i):(j)+2;
                        但意却为result = ((i)>(j)?(i):(j)) + 2;
              (2)不可调试
              (3)无法操作类的私有数据成员

        C++函数内联机制既具备宏代码的效率,又增加了安全性,且可自由操作类的数据成员。
        关键字inline必须与函数定义体放在一起才能使函数真正内联,仅把inline放在函数声明的前面不起任何作用。因为inlin是一种用于实现的关键字,不是一种用于声明的关键字。
        许多书籍把内联函数的声明、定义体前都加了inline关键字,但声明前不应该加(加不加不会影响函数功能),因为声明与定义不可混为一谈。

★声明、定义和语句
声明:就是在向系统介绍名字(一个名字是一块内存块的别名),只是告诉编译器这个名字值的类型及宣告该名字的存在性,仅此而已。
定义:则是分配存储空间,即具有了存储类型。
语句:程序的基本组成部分,分可执行语句(定义是)和不可执行语句(声明是)。
在正式编写程序语句前定义的一些全局变量或局部变量,在C中为声明,C++中为定义。
例如:int  a;//在标C中为声明,是不可执行语句;在C++中为定义,是可执行语句
      extern int a;//为声明,是不可执行语句   CWinApp  curApp;//对象定义是可执行语句

◆使用内联函数时应注意以下几个问题:
(1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。
(2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。 
(3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。
(4) 内联函数要在函数被调用之前声明。
例如:
#include <iostream.h>
int increment(int i);
inline int increment(int i){
  i++; return i;
}
void main(void){  ……
}
如果我们修改一下程序,将内联函数的定义移到main()之后: 
    #include <iostream.h>
int increment(int i);
void main(void){  ……
}
//内联函数定义放在main()函数之后
inline int increment(int i){
  i++; return i;
}
内联函数在调用之后才定义,这段程序在编译的时候编译器不会直接把它替换到main中。也就是说实际上"increment(int i)"只是作为一个普通函数被调用,并不具有内联函数的性质,无法提高运行效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式ID生成方法

1、sharding-jdbc 基于Twitter Snowflake算法实现。但是snowflake算法的缺陷&#xff08;强依赖时间&#xff0c;如果时钟回拨&#xff0c;就会生成重复的ID&#xff09;&#xff0c;sharding-jdbc没有给出解决方案&#xff0c;如果用户想要强化&#xff0c;需要自行扩展&…

10月数据库排行:Microsoft SQL Server分数增加最多

DB-Engines 数据库流行度排行榜 10 月更新已发布&#xff0c;排名前二十如下&#xff1a;这期的数据比较有意思&#xff0c;到了这个月&#xff0c;Microsoft SQL Server 马上扭转局势&#xff0c;成了分数增长最多的一个&#xff0c;与上个月相比其增加了 9.66 分&#xff0c;…

判断两个链表是否相交

如果两链表都无环&#xff0c;直接判断尾是否相交&#xff0c;如果都有环&#xff0c;则判断一链表上指针相遇的节点&#xff08;环入口点&#xff09;在不在另一个链表上。方法如下&#xff1a;【摘要】有一个单链表&#xff0c;其中可能有一个环&#xff0c;也就是某个节点的…

VS Code 1.39 发布!Web 版 VS Code 是否离我们越来越近了?(文末彩蛋)

今天&#xff08;北京时间 2019 年 10 月 10 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.39 版本。此版本主要更新的内容包括&#xff1a;Source Control tree view - 可以通过列表或者树状图两种方式来展示被改变的文件。Toggle region folding keyboard sho…

Java引用类型——强引用、软引用、弱引用和虚引用

Java执行GC判断对象是否存活有两种方式其中一种是引用计数。 引用计数&#xff1a;Java堆中每一个对象都有一个引用计数属性&#xff0c;引用每新增1次计数加1&#xff0c;引用每释放1次计数减1。 在JDK 1.2以前的版本中&#xff0c;若一个对象不被任何变量引用&#xff0c;那么…

二叉树分析(两点最大距离)

转载自&#xff1a;http://blog.csdn.net/lalor/article/details/7626678 http://blog.csdn.net/lalor/article/details/7618120 把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写…

IT从业的迷思与破解之道(更新)

我只是单纯做技术的程序员&#xff0c;什么靠微信广告攒钱这些&#xff0c;跟我没有半毛钱关系&#xff0c;初衷很简单&#xff0c;只重视正三观的正确技术知识分享在这到处都是线上培训&#xff0c;付费知识的社群里&#xff0c;随便搜个词都有您想要的内容哪轮到我们。技术的…

graphcut 用于最优缝合先寻找_Image Stitching

Graphcut 求解最佳缝合线&#xff1a; 主要参照硕士学位论文《基于不同视点样图的图像修复》 Graphcut 主要参照&#xff1a; http://blog.csdn.net/zouxy09/article/details/8532111 Graph cuts是一种十分有用和流行的能量优化算法&#xff0c;在计算机视觉领域普遍应用于…

最后一个单词的长度

题目描述 给定一个仅包含大小写字母和空格 ’ ’ 的字符串&#xff0c;返回其最后一个单词的长度。 如果不存在最后一个单词&#xff0c;请返回 0 。 说明&#xff1a;一个单词是指由字母组成&#xff0c;但不包含任何空格的字符串。 示例: 输入: "Hello World"…

.netcore 开发的 iNeuOS 物联网平台部署在 Ubuntu 操作系统,无缝跨平台

1. 概述参见前两篇文章&#xff1a;《iNeuOS完全使用.netcore开发&#xff0c;主要为企业、集成商打造从网关、边缘应用、云端建设的物联网/工业互联网平台产品级解决方案。面向应用场景&#xff1a;&#xff08;1&#xff09;嵌入式硬件网关的开发和部署&#xff0c;形成自己…

按照前序遍历和中序遍历构建二叉树

转载自&#xff1a;http://blog.csdn.net/sbitswc/article/details/26433051 Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that duplicates do not exist in the tree. There is an example._______7______/ …

线程间通讯方式

线程间通讯方式 1&#xff1a;同步&#xff08;synchronized&#xff09; 2&#xff1a;共享变量&#xff08;volatile&#xff09; 2&#xff1a;wait/notify()机制 3&#xff1a;管道通信就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信 进程间…

刷新:重新发现.NET与未来

是新朋友吗&#xff1f;记得先点蓝字关注我哦&#xff5e;微软在比尔盖茨手中创立并崛起, 成为PC互联网时代的霸主&#xff0c;很多70&#xff0c;80后都有MVP Edi Wang 的体验<“ 当时的微软对我来说就是神的存在。因为我认识电脑到使用电脑的一切几乎都离不开这家伟大的公…

OpenCV Stitching_detailed 详解

算法流程函数&#xff1a; 1. (*finder)(img, features[i]) Mathematical explanation: Refer to BRIEF: Binary Robust Independent Elementary Features and ORB: An efficient alternative to SIFT or SURF ...\sources\modules\stitching\src\matchers.cpp void OrbFe…

合并区间

题目描述 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2: 输入: [[1,4],[4,5]] 输出: [[1,5]] 解释: 区间 [1,4] 和 [4,5]…

程序员修神之路--设计一套RPC框架并非易事

菜菜哥&#xff0c;我最近终于把Socket通信调通了这么底层的东西你现在都会了&#xff0c;恭喜你离涨薪又进一步呀http协议不也是利用的Socket吗可以这么说&#xff0c;http协议是基于TCP协议的&#xff0c;底层的数据传输可以说是利用的socket既然Socket通信会了&#xff0c;那…

GPU Shader 编程基础

转载自&#xff1a;http://www.cnblogs.com/youthlion/archive/2012/12/07/2807919.html 几个基本概念&#xff1a; Vertex buffer&#xff1a;存储顶点的数组。当构成模型的所有顶点都放进vertex buffer后&#xff0c;就可以把vertex buffer送进GPU&#xff0c;然后GPU就可…

Azure pipeline 配置根据条件执行脚本

Azure pipeline 配置根据条件执行脚本Intro我的应用通过 azure pipeline 来做持续集成&#xff0c;之前已经介绍了根据不同分支去打包不同的package&#xff0c;具体的就不再这里详细介绍了&#xff0c;可以参考 Solution来看一下修改之后的 azure-pipelines.yaml 示例配置吧&a…

监督学习和非监督学习

转自&#xff1a;http://blog.csdn.net/warrior_zhang/article/details/41453327 机器学习的常用方法&#xff0c;主要分为有监督学习(supervised learning)和无监督学习(unsupervised learning)。 监督学习&#xff0c;就是人们常说的分类&#xff0c;通过已有的训练样本&am…

C# 8 新特性 - 可空引用类型

Nullable Reference Type.在写C#代码的时候&#xff0c;你可能经常会遇到这个错误&#xff1a; 但如果想避免NullReferenceException的发生&#xff0c;确实需要做很多麻烦的工作。 可空引用类型 Null Reference Type 所以&#xff0c;C# 8的可空引用类型就出现了。 C# 8可以让…