C++学习之内联函数

内联函数与宏区别

   需要在函数前加上关键字inline,但inline是建议性关键字,当请求将函数作为内联函数时,编译器并不一定会满足这种要求。内联函数尽量避免函数体过长、含有循环、递归。

内联函数的优势在于做参数类型检查,而宏定义不会,宏只是简单的文本替换。

1、宏不能访问对象的私有成员。
2、宏的定义很容易产生二意性。

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

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

对于C++中内联机制的一个常见误解是:关键字"inline"只是对编译器的建议,如果编译器发现指定的函数不适合内联就不会内联;所以即使内联使用的不恰当也不会有任何副作用。这句话只对了一半,内联使用不恰当是会有副作用的:会带来代码膨胀,还有可能引入难以发现的程序臭虫

根据规范,当编译器认为希望被内联的函数不适合内联的时候,编译器可以不内联该函数。但是不内联该函数不代表该函数就是一个普通函数了,从编译器的实际实现上来讲,内联失败的函数与普通函数是有区别的:

(1)普通的函数在编译时被单独编译一个对象,包含在相应的目标文件中。目标文件链接时,函数调用被链接到该对象上。

(2)若一个函数被声明成内联函数,编译器即使遇到该函数的声明也不会为该函数编译出一个对象,因为内联函数是在用到的地方展开的。可是若在调用该内联函数的地方发现该内联函数的不适合展开时怎么办?一种选择是在调用该内联函数的目标文件中为该内联函数编译一个对象。这么做的直接后果是:若在多个文件调用了内联失败的函数,其中每个文件对应的目标文件中都会包含一份该内联函数的目标代码。

#define SQUARE(X) X*X

a = SQUARE(5.0); // a = 5.0 * 5.0
b = SQUARE(4.3 + 3.1); // 4.3 + 3.1 * 4.3 + 3.1
c = SQUARE(d++) // c == d++ * d++ d递增两次
宏定义时不能忘记括号的使用,否则会造成运算错误。但是上述代码中,加上括号仍然会出现错误,在第三个函数中,d依旧递增两次。如果使用内联函数,则是计算出 d 的值在进行传递,并进行运算,就只会递增一次。

原文地址:https://www.cnblogs.com/xlsss159/p/10361172.html

时间: 2024-11-04 13:58:21

C++学习之内联函数的相关文章

代码重构之内联函数

意图 - 内部代码和函数名称同样清晰易读,去除无用的间接层 示例 /** * 内联函数之前 * Created by luo on 2017/4/18. */ public class InlineMethodBefore { private Integer _numberOfLateDeliveries ; int getRating(){ return (moreThanFiveLateDliveries()) ? 2 : 1; } private boolean moreThanFiveL

C/C++ 之内联函数

在C中可以使用#define提高执行效率,但是容易出错,而在C++ 支持函数内联,其目的亦是如此. (1)inline的工作原理: 对于任何内联函数,编译器在符号表里放入函数声明(包括名字,参数类型,返回值类型).如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表中.在调用一个内联函数时,编译器首先检查调用是否正确,比如进行类型安全检查,进行类型转换等.如果正确,内涵函数的代码将会直接替换函数调用,于是省去了函数调用的开销. 这个与#define是不同的,因为#define不能进

Java之内联函数

以前用过C++,知道它里面有一个内联函数这个概念,一般情况用inline关键字修饰,在C++定义类时,那种写中Class定义里面的函数,也被编译器当做内联函数处理. 说了这么多,还没说什么是内联函数.所谓内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度. 现在该说Java了,对应Java语言中也有一个关键字final来指明那个函数是内联的,例: Java代码   public final void doSo

python3学习之内置函数

filter    参数中函数返回True或者False,将元素返回到结果 li = [1,2,3,4,5,6] f = lambda a: a>3    原理:简单函数用lambda:a相当于参数,"a>3"是函数体,有返回值 filter(函数A,可迭代序列B)   原理:把B的值逐个给A,过滤机制在函数A中,返回True时输出当前B的值,否则不输出 filter(lambda a: a>3,li) def  f1(a): if  a>3: return T

C++之内联函数与constexpr

inline 函数 规模小,流程直接且频繁调用 cout<<shortString(s1,s2)<<endl; = cout<<(s1.size()<s2.size()?s1:s2)<<endl; constexpr函数是指能用于常量表达式的函数.函数的返类型及所有形参的类型都得是字面值类型,而且函数体中必须有一条return语句:

C++学习笔记之——内联函数,引用

本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者:晨凫追风 一直想开始写C++的学习笔记,学习C++已经两个月了,今天开始写一下引用,内联函数,的一些概念和作用吧.那么开始吧! ????内联函数: 我们写的程序最终都是要用编译器,进行编译链接形成一段机器可以知道的二进制代码,接着存到一个内存中,这时候每一段程序代码都会有自己的一个地址,计算机按照地址增

C++学习之路 : 关于内联函数

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同.对于由两个文件compute

AT&amp;T学习笔记汇编之内联c语言

asm("assembly code"); ansi c将asm用于其它用途,用__asm__替换 在asm后面加上 volatile可以禁止编译器优化 asm volatile ("pusha \n\tpopa"); __asm__ __volatile__ ("pushl $1\n\t"); 扩展asm asm ("asm code" : output locate : input operands : changed r

学习笔记 内联函数

1.      什么是内联函数? 内联函数,从形式上看就是普通函数首部前添加了一个inline,形式如下 inline(参数列表) { //语句 }; 2.      为什么引进内联函数? 内联函数与普通函数的区别在于,内联函数的调用不会转移程序控制权,而是在调用点处进行"内联"展开函数体,类似于宏展开(区别在于宏展开是由预处理器负责,而内联展开由编译器负责).这样一来,可避免普通函数调用带来的开销. 3.      什么情况适合用内联函数? 当代码量只有几行(一般5行以内),语句简单