1宏定义

C++是C的超集,C++继承了C的一个重要特性就是效率,在C中提高程序运行效率的重要手段就是宏,宏可以不用普通函数的调用但使用起来就像普通函数调用一样,宏的实现采用的是预处理器而不是编译器,所以就没有了参数调用、生成汇编语言的CALL,返回参数和执行汇编语言RETURN等时间的花费,因而大大提高了程序执行的效率。当然在C++中也可以采用这种方式提高程序执行的效率。

例如:

#include<iostream.h>

#define doub(x) x*2

int main()

{

for(int i=1;i<=3; i++)

cout<<i<<"doubled is "<<doub(i)<<endl;

cout<<"1+2doubled is "<<doub(1+2)<<endl;

return 0;

}

程序运行的结果为:

1 doubled 2

2 doubled 4

3 doubled 6

1+2 doubled 5

当程序运行到cout<<i<<"doubled is "<<doub(i)<<endl;和cout<<"1+2doubled is "<<doub(1+2)<<endl;时,直接将宏定义的代码在程序中直接展开,这样就省去了函数调用的开销,大大提高了程序执行的效率。

2内联函数

在C++中,函数说明之前,冠以关键字"inline",该函数就被声明为内联函数。它和宏定义有着相同的作用和相似的机理,在内联函数被调用时,C++的编译器使用函数体中的代码替代函数调用表达式,这样就较少的函数调用的开销,加快的了程序的执行。

例如:

#include<iostream.h>

inline float circle(float r)

{return 3.1416rr;}

int main(){

for(int i=1;i<=3;i++)

cout<<"r=“<<i<<” area="<<circle(i)<<endl;

return 0;

}

程序运行的结果为:

r=1 area=3.1416

r=2 area=12.5664

r=3 area=28.2744

当程序运行到cout<<"r=“<<i<<” area="<<circle(i)<<endl;时直接将定义的内联函数在程序展开,减少了普通函数调用的开销,提高了程序执行的效率,这一点和宏定义非常相似,但是两者又不完全相同,而且有着非常重要的区别。

3两者之间的区别

对于上面的第二道例题采用内联函数和宏定义,所得的程序运行的结果应该是相同的,那么它们之间的区别在哪里呢?我们再来研究一下上面的第一道例题。虽然宏定义在外观和行为上与函数调用一样,但是当微妙的差异出现时,问题就出现了。例如对于第一道例题,该程序所定义的宏是完成乘2的功能,那么分析程序运行的结果,可以看出前三个结果是正确的,但是第四个结果与期望的值由区别,我们期望的结果应该是6,而实际运行的结果却是5,问题的原因是编译程序将输出语句cout<<"1+2doubled is "<<doub(1+2)<<endl;解释为cout<<"1+2doubled is "<<1+2*2<<endl;,它改变了原先我们所期望的运算符的优先级的次序,所以所得的结果也不是我们事先所期望的,程序执行的结果为5。由这个例子可以看出宏定义本身存在着一定的不安全性,有时会隐藏难以发现的错误。相反,如果这个例子采用内联函数来完成的话,实验证明,程序运行的结果为:

1 doubled 2

2 doubled 4

3 doubled 6

1+2 doubled 6

通过这个例子,我们可以看出内联函数和宏定义之间的区别,内联函数消除了宏定义存在着的潜在的不安全

性,因此,大多数程序员在编写程序的时候,很少采用宏定义。

4结论

下面我们研究一下造成这种区别的根本原因,宏定义的实现是通过预处理器,而内联函数的实现是通过编译器,正是这样的差别造成了以上程序运行结果的不同。宏定义存在的关键问题是我们可能认为预处理器的行为和编译器的行为一样,因此在使用过程中容易被混淆。

最后,学习从来不是一个人的事情,要有个相互监督的伙伴,对于C/C++感兴趣可以搜素千人群:C/C++学习编程13群(jack建立)有兴趣交流或者了解一下的可以进来交流,另外进群就可以领取相关的学习资料哦

【参考文献】

[1]王菊英. 当前我国利率走势探究[J]. 经济师 , 2003,(05)

[2]刘繁荣.建设学习型企业之管见[J]现代管理科学 , 2004,(04)

[3] 任美姣. 浅谈合作探究教学模式[J]. 浙江工商职业技术学院学报 , 2003,(02)

[4]齐善鸿. 分合的逻辑与趋势–对企业两权分合的研究与思考[J]. 理论与现代化 , 1999,(01)

[5]杨则正. Symantec公司的C++8.0编译器[J]. 管理科学文摘 , 1998,(11)

[6]杨凡. 浅析C++中内联函数与宏的区别[J]. 科技咨询导报 , 2007,(01)

[7]郑冉冉. 企业营销道德问题探究[J]. 江苏商论 , 2005,(07)

[8]付昱纲. 网络名人:C++之父――Stroustrup[J]. 教育与职业 , 2003,(18)

[9]杨勇. 我国独立董事职业化道路的探究[J]. 经济前沿 , 2005,(06)

[10]陈永强. 《电子商务概论》课程大纲探究[J]. 杭州师范学院学报(医学版) , 2005,

[11]]《c + + 语言和面向对象程序设计教程》 陈维兴 林小茶 编著 清华大学出版社 2000. 1

C++中宏与内联函数相关推荐

  1. 宏与内联函数(面试常考)

    第一部分:宏 为什么要使用宏呢? 因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方.这种转移操作要求在转去执行前要保存现 ...

  2. C++ 宏与内联函数

    因为函数调用需要开销(如:保护调用者的运行环境.参数传递.执行调用指令等),所以函数调用会带来程序执行效率的下降,特别是对一些小函数的频繁调用将是程序的效率有很大的降低. C++提出了两种解决方法:宏 ...

  3. C6678程序中的_mfence()内联函数

    常见用法:一般在对内存进行操作时使用,通常使用两次.详见下面的例子 static inline void WritebackCache(void * blockPtr, Uint32 byteCnt) ...

  4. C++中的内联函数inline总结

    C++中的内联函数inline总结 标签: c++编译器vector编程汇编windows 2011-08-26 21:46 13982人阅读 评论(8) 收藏 举报 分类: c/c++进行时(28) ...

  5. java内联_JAVA中的内联函数

    在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到 转去执行该函数前的地方.这种转移操作要求在转去前要保护 ...

  6. C++11 中的内联函数、auto关键字、for循环及空指针

    C++ 3 内联函数 概念 特性 auto关键字 定义 使用 auto与指针结合起来使用 在同一行定义多个变量 auto不能推导的场景 auto不能作为函数的参数 auto不能直接用来声明数组 基于范 ...

  7. C++---内联函数与宏

    内联函数 使用inline关键字修饰的函数称为内联函数.编译器会在内联函数调用的地方对其进行函数展开. 特性 内联函数是以空间换时间的思想. inline修饰的函数,只是建议编译器对其进行优化. 综上 ...

  8. C++中的糖果——缺省参数、内联函数、auto及nullptr关键字

    在C++中,相对于C语言,我们引入了许多新的概念,新的机制,它们的到来让我们的编程方便了不少,它并没有多么难理解,但是比较零碎,在我看来它就是一些加分项,故此,我们通常也将其称为C++中的糖果.下面就 ...

  9. C++知识总结——内联函数与宏

    内联函数与宏 1.内联函数 1.1什么是内联函数 1.2选择使用内联函数 1.3内联函数优缺点 1.4内联函数与宏 1.5内联函数补充 1.内联函数 1.1什么是内联函数 ​​​  内联函数是c++的 ...

最新文章

  1. c# partial class 的用法
  2. linux系统下的动态壁纸,您可以在下面下载动态壁纸APK和linuxct的配套应用
  3. java面向对象super,final,static,匿名对象,内部类学习
  4. 鬼题Ghost [manacher]
  5. 取代不了 C/C++ 的 Rust 如何“逆袭”?
  6. 贪心算法——字典序最小问题
  7. js中的继承1--类继承
  8. ArcGIS软件中的坐标系及数据类型的概念
  9. ad20中如何在pcb里查找器件_技巧:Altium Designer中快速定位器件
  10. 我是社保局工作的,给大家介绍一下准确的“一老一小”保险知识[转载]
  11. iphone4电信版怎么写号_电信iphone4如何剪卡以及写号
  12. Netlogo入门(一)
  13. 一起学JAVA线程-JAVA Thread的基础
  14. OpenLayers风场图
  15. python批量下载微博贴评论图片
  16. 《视觉SLAM进阶:从零开始手写VIO》(二)
  17. 计算机器和智能-阿兰图灵(转帖)
  18. 挥一挥衣袖,开始一段新的旅程
  19. sw2urdf使用探索
  20. 【深度思维】读书笔记

热门文章

  1. 钉钉api 获取 accesstoken_Thinkphp5.X异常接管后通过钉钉机器人推送通知
  2. javascript中基本包装、算数运算符、递增递减运算符、赋值运算符、比较运算符、逻辑运算符、运算符优先级
  3. sql语句优化之一:尽量使用索引避免全表扫描
  4. springmvc通过@Value注解读取Properties配置文件的值,junit测试可以取到值,但是在业务中无法读取
  5. B端产品设计——批量导入
  6. 互联网晚报 | 1月11日 星期二 | 恒大集团退租深圳总部大楼;荣耀发布首款折叠旗舰手机;虎牙拿下5年LPL独播权...
  7. 移动应用安全形势分析报告
  8. 中国中小微企业云服务市场专题分析2020
  9. java移动文件导致tomcat死掉_原 netty导致tomcat假死
  10. 基于百度贴吧的HIV高危人群特征分析