宏定义和内联函数区别

  内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。 宏定义不检查函数参数,返回值什么的,只是展开,相对来说,内联函数会检查参数类型,所以更安全。
  内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。 
  声明内联函数看上去和普通函数非常相似: 
      void f(int i, char c); 
     
  当你定义一个内联函数时,在函数定义前加上 inline 关键字,并且将定义放入头文件: 
      inline 
      void f(int i, char c) 
      { 
      // ... 
      } 
          
     任何在类的说明部分定义的函数都会被自动的认为是内联函数。 
     内联函数必须是和函数体申明在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。 
     Inline tablefunction(int I) {return I*I}; 
     
     这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。 
     我们也可以将定义在类的外部的函数定义为内联函数,比如: 
     Class TableClass{ 
     Private: 
      Int I,j; 
     Public: 
      Int add() { return I+j;}; 
      Inline int dec() { return I-j;} 
      Int GetNum(); 
    } 
    inline int tableclass::GetNum(){ 
    return I; 
    } 
     
     上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。 
     内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。 
     Class sample{ 
      Private: 
       Int nTest; 
      Public: 
       Int readtest(){ return nTest;} 
      Void settest(int I) {nTest=I;} 
     } 
     
     当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

转载于:https://www.cnblogs.com/chengxuyuancc/archive/2013/04/04/2999844.html

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

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

相关文章

24-光流估计

光流是空间运动物体在观测成像平面上的像素运动的“瞬间速度”,根据各个像素点的速度矢量特征,可以对图像进行动态分析,例如目标跟踪 亮度恒定:同一点随着时间的变化,其亮度不会发生改变 小运动:随着时间的…

java公平索非公平锁_java中的非公平锁不怕有的线程一直得不到执行吗

首先来看公平锁和非公平锁,我们默认使用的锁是非公平锁,只有当我们显示设置为公平锁的情况下,才会使用公平锁,下面我们简单看一下公平锁的源码,如果等待队列中没有节点在等待,则占有锁,如果已经…

mybatis.net - 5 嵌入资源与引用资源

在SqlMap.config文件中可以有两种方式引入外部的文件。 一种是通过资源的方式&#xff0c;在文件中表现为 resource&#xff0c;就是引用外部的文件&#xff0c;这里需要保证文件的路径正确。 <sqlMaps><sqlMap resource"Maps/ProductMap.xml"/><sqlM…

智能车复工日记【3】:图像处理——基本扫线和基本特征提取和十字补线

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录 1、系列文章2、前言3、基本扫线(除了进入环岛状态或者坡道或者十字路口的普通扫线)1.基本数据和初步特征4、进一步特征…

short 用equals_Java Short类equals()方法的示例

short 用equals短类equals()方法 (Short class equals() method) equals() method is available in java.lang package. equals()方法在java.lang包中可用。 equals() method is used to check equality or inequality of this Object against the given Object or in other wo…

图解MySQL数据库的陈列和把持-4

泉源&#xff1a;网海拾贝 填入一些测试数据&#xff1a; 封闭“MySQL Query Browser”&#xff0c;再从头翻开它&#xff0c;切换到testtable表&#xff0c;看到了没有&#xff1f;刚刚输出的中文变成了“&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&am…

非常好友(C++)

Bessie和其他的所有奶牛的耳朵上都戴有一个射频识别&#xff08;RFID&#xff09;序列号码牌。因此农夫John可以机械化地计算他们的数量。很多奶牛都有一个“牛友”。如果奶牛A的序列号的约数之和刚好等于奶牛B的序列号&#xff0c;那么A的牛友就是B。在这里&#xff0c;一个数…

智能车复工日记【2】——普通PID、变结构PID、微分先行PID、模糊PID、专家PID

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录 系列文章前言普通PID舵机参数:电机参数:变结构PI控制(电机控制,这里对公式进行修改采用正态分布公式)微分先行PID(…

爬动的蠕虫(C++)

问题描述&#xff1a; 一条虫子在n英寸深的井底&#xff0c;每次一分钟爬行u英寸&#xff0c;但是它再次爬行前必须先休息1分钟&#xff0c;在休息过程中它将滑落d英寸&#xff0c;在反复向上爬行和休息后&#xff0c;多长时间虫子能爬出这口井&#xff1f;在此过程中&#xf…

使用快捷键,快到极致

前段时间曾经写过一篇文章&#xff0c;《优秀程序员无他-善假于物也》。其中谈到一点是优秀的程序员必须要能灵活的掌握常用软件的快捷键。对于程序员来说&#xff0c;每天使用时间最长的软件恐怕就是IDE&#xff08;Integrated Development Environment&#xff09;了。如果你…

java反射对象赋值_Java反射详解

反射(Reflection)能够让运行于 JVM 中的程序检测和修改运行时的行为。Class类提供了以下方法四个public方法&#xff0c;用于获取某个类的构造方法&#xff1a;Constructor getConstructor(Class[] params)// 根据构造函数的参数&#xff0c;返回一个具体的具有public属性的构造…

Oracle装置后果

来历&#xff1a;网海拾贝 本日未来诰日装置Oracle后&#xff0c;出现了两个后果。 经过过程SQL Plus不竭无法连接长途数据库&#xff0c;提醒错误ORA-12514:TNS:监听过程不能解析在连接描绘符中给出的SERVICE_NAME。 厥后缔造用可视化的Net Configuration Assistant东西对监听…

Java Hashtable hashCode()方法及示例

Hashtable类hashCode()方法 (Hashtable Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to return the hash code value for this object in this Hashtable. hashCode()方法…

C---蝉、蜻蜓、蜘蛛

【问题描述】 已知 腿/条翅膀/对蝉61蜻蜓62蜘蛛80 现有小虫n只&#xff0c;共有X条腿和Y对翅膀&#xff0c;问蝉、蜻蜓、蜘蛛各有多少只&#xff1f;请使用循环的知识解决&#xff0c;数据确保有解。 【输入形式】三个用空格隔开的整数&#xff0c;依次为n、X、Y 【输出形式】…

轮廓(查找和绘制轮廓、轮廓的表达与组织、轮廓的特性)

目录1、轮廓的定义2、如何在图像中找到轮廓opencv自带的查找轮廓函数:findContours()3、轮廓的表达方式1.顶点的序列2.Freeman链码4、轮廓之间的组织方式5、轮廓的特点&#xff08;这部分可以展开来详细探讨&#xff0c;这里不做过多解释&#xff09;6、轮廓的匹配7、绘制轮廓d…

python如何操作oracle数据库_python操作oracle数据库

搜索热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家&#xff0c;也给大家做个参考。# -*- mode: python; coding: utf-8 -*-## python operate oracle,contain insert、delete、update、select.## author liyulin# date 2014-11-07import…

可能用得上的jquery 插件

Chosen (github) 是一个强大的增强下拉选择框的插件&#xff0c;支持自定义css样式。同时你可以使用ajax增加一些回调函数&#xff0c;插件会给hidden input复制&#xff0c;这样你可以在提交表单的时候获得正确的值。 Turn.js 是一个 JavaScript 库&#xff0c;使您的网页内容…

草根创业回忆录二: 都选择的是什么人?

草根创业回忆录二: 都选择的是什么人&#xff1f; 前言&#xff1a;选合伙人和投资就像在选女朋友一样&#xff0c;要谨慎&#xff0c;甚至有时候宁缺毋滥。 曾经以为有了钱&#xff0c;就会找到需要的人&#xff0c;后来发现不是这样的。 也以为&#xff0c;随便拉几个关系好的…

float.equals_Java Float类equals()方法与示例

float.equals浮动类equals()方法 (Float class equals() method) equals() method is available in java.lang package. equals()方法在java.lang包中可用。 equals() method is used to check equality or inequality of this Object against the given Object or in other wo…

01-基本配置与测试

一、开发环境 使用的是Anaconda 3&#xff0c;其中Python版本为3.6.3 首先&#xff0c;在Anaconda下的Scripts文件夹下打开命令框 使用pip install -U selenium安装selenium 打开Jupiter Notebook&#xff0c;输入from selenium import webdriver进行测试 不报错即安装成功 …