`
fireDragonpzy
  • 浏览: 463214 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

C++效率(二)C++内联函数

c++ 
阅读更多
  介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如

#define TABLE_COMP(x) ((x)>0?(x):0)
  
就定义了一个宏。

  为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。 

  但是宏也有很多的不尽人意的地方。

  1、.宏不能访问对象的私有成员。

  2、.宏的定义很容易产生二意性。

  我们举个例子:

#define TABLE_MULTI(x) (x*x)

  我们用一个数字去调用它,TABLE_MULTI(10),这样看上去没有什么错误,结果返回100,是正确的,但是如果我们用TABLE_MULTI(10+10)去调用的话,我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。

#define TABLE_MULTI(x) ((x)*(x))

  这样可以确保不会出错,但是,即使使用了这种定义,这个宏依然有可能出错,例如使用TABLE_MULTI(a++)调用它,他们本意是希望得到(a+1)*(a+1)的结果,而实际上呢?我们可以看看宏的展开结果: (a++)*(a++),如果a的值是4,我们得到的结果是5*6=30。而我们期望的结果是5*5=25,这又出现了问题。事实上,在一些C的库函数中也有这些问题。例如: Toupper(*pChar++)就会对pChar执行两次++操作,因为Toupper实际上也是一个宏。 

  我们可以看到宏有一些难以避免的问题,怎么解决呢?

  下面就是用我要介绍的内联函数来解决这些问题,我们可以使用内联函数来取代宏的定义。而且事实上我们可以用内联函数完全取代预处理宏。

  内联函数和宏的区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

  我们可以用Inline来定义内联函数,不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。

  下面我们来介绍一下内联函数的用法。

  内联函数必须是和函数体申明在一起,才有效。像这样的申明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;}
}

  当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。
分享到:
评论

相关推荐

    c++中的宏、内联函数和宏的比较

    在C++编程中,宏和内联函数是提高代码效率和可读性的两种常见方法。它们各自有着不同的应用场景和特点,了解这些差异对于编写高质量的C++代码至关重要。 #### 宏(Macro) 宏是一种预处理器指令,它可以在编译前对...

    C++Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数)[收集].pdf

    C++ Hook(钩子)编程,通过内联汇编,使类成员函数代替全局函数(静态函数) 本文研究了C++ Hook(钩子)编程中,使类成员函数代替全局函数(静态函数)的技术。通过内联汇编,构造类对象独享的函数(委托),完成了类成员...

    内联函数-14.08.25

    内联函数是C++语言中的一个重要特性,它主要用于提高程序的运行效率。通过在函数调用处直接嵌入函数体,内联函数避免了传统函数调用带来的额外开销(如参数压栈、返回地址保存等)。本篇文章将详细介绍内联函数的...

    C++内联汇编示例

    C++内联汇编是一种将汇编语言代码嵌入到C++程序中的技术,它允许开发者在高级语言中直接插入低级操作,以优化特定性能关键的代码段或解决特定平台的问题。本工程通过一系列示例,展示了如何在C++程序中使用内联汇编...

    C++ 实验1 重载函数和内联函数的应用 

    在C++编程语言中,重载函数和内联函数是两个重要的概念,它们极大地提高了代码的可读性和执行效率。本实验旨在通过实际操作来帮助学生深入理解和掌握这两个概念。 首先,我们来看重载函数。函数重载允许在同一作用...

    内联函数体要放在头文件

    在C++中,内联函数是一种特殊的函数类型,它的主要目的是减少函数调用的开销,提高程序执行效率。然而,为了实现这一目标,内联函数的定义和使用方式与普通函数有着显著的区别。 ### 内联函数的概念与作用 内联...

    计算机程序设计(C++)计算机程序设计(C++)04-6.2内联函数_25_25.pptx

    内联函数是C++编程语言中一种优化技术,它的主要目的是减少函数调用带来的开销,提高程序执行的效率。函数调用通常涉及到函数调用的压栈、跳转、返回等多个步骤,这些步骤在频繁调用小规模函数时会消耗一定的时间。...

    如何使用内联函数,请看这个资料

    内联函数的优点是可以提高函数的执行效率,因为它省去了函数调用的开销。但是,内联函数也存在一些缺点。例如,如果函数体内的代码较长,使用内联将导致内存消耗代价较高。此外,如果函数体内出现循环,那么执行函数...

    C++语言内联函数的引出-宏函数的缺陷.zip

    在C++编程语言中,内联函数的引入主要与宏函数的缺陷有关。宏函数是C++中的一个预处理器特性,允许程序员定义可替换的文本片段。然而,宏函数在某些情况下存在一些固有问题,这使得C++引入了内联函数作为更安全、更...

    C++ 函数 练习题

    根据给定文件的信息,我们可以总结出以下几个重要的C++知识点: ...以上总结了C++函数相关的基础知识、内联函数、函数重载以及选择题的答案解析,这些都是学习C++编程的基础知识点,对于初学者来说非常重要。

    内联函数笔记

    内联函数是C++编程语言中的一种特性,它主要用于提高程序执行效率,特别是在频繁调用的小型函数中。内联函数的设计目标是替代C语言中的宏定义,克服宏定义的一些弊端,同时保留其效率优势。 在C语言中,宏定义(如`...

    对内联函数与普通函数的一些比较与分析.doc

    内联函数和普通函数是C++编程中两种不同的函数实现方式,它们在程序性能和内存使用上有显著区别。内联函数的主要目的是为了提高程序的执行效率,通过避免函数调用时的开销,如参数传递、函数调用的返回过程等。而...

    在 Visual C++ 中使用内联汇编

    内联汇编能够利用C/C++变量和函数,使其易于整合进现有项目。此外,它适用于编写高性能代码、设备驱动中直接硬件访问以及编写特定功能的函数,特别是在对速度有极高要求的情况下。 ### 二、内联汇编的关键字:\_\_...

    内联函数及三种重载

    内联函数及三种重载代码,C++实习经常用到的代码内容

    预处理宏和内联函数的区别

    预处理宏和内联函数在C/C++编程中都是为了提升程序效率而设计的工具,但它们在使用上有着本质的区别。本文将深入探讨这两种技术,帮助开发者更好地理解和利用它们。 首先,预处理宏是一种在编译之前进行的文本替换...

    在Visual_C++中使用内联汇编

    #### 二、内联汇编的优缺点 ##### 优点: 1. **灵活性高**:内联汇编可以处理一些C/C++本身无法直接处理的任务,如直接访问硬件资源。 2. **无缝集成**:可以直接在C/C++代码中使用,无需额外工具或编译步骤。 3. *...

    c++中的内联函数inline用法实例

    "C++中的内联函数inline用法实例" C++中的内联函数是一种特殊的函数类型,它可以在编译期间将函数体替换到调用处,以...但是,需要注意内联函数的使用限制和实际情况,合理地使用内联函数可以提高代码的质量和效率。

    内联函数和宏的区别的分析与总结

    内联函数和宏在C++编程语言中是两种常见的代码优化技术,它们都可以用来替代函数调用,以减少函数调用带来的开销。然而,两者在实现方式、编译过程和功能特性上有着显著的区别。 首先,我们来看内联函数。内联函数...

    c++钩子函数:copy hook_linux函数hook

    总结来说,"c++钩子函数:copy hook_linux函数hook"是一个C++项目,它在Linux环境下实现了文件复制操作的监控和控制,可能通过内核模块、用户空间钩子或两者结合的方式。项目使用了ATL库来创建COM接口,并提供了类型...

    C++编程中队内联函数的理解和使用

    在C++编程中,内联函数是一种优化技术,旨在提高程序的执行效率,尤其是对于小型功能的实现。内联函数的基本概念是通过在编译时将函数体插入到每个调用点来消除函数调用时的开销,而不是在运行时通过栈帧管理进行...

Global site tag (gtag.js) - Google Analytics