精华内容
下载资源
问答
  • 关键字inline

    2018-07-15 22:31:55
    关键字——inlineinline关键字的前世个人理解,C++中inline关键字的出现可能与#define宏定义有关(define不是关键字)。因为#define宏定义在C语言中起到替换作用的,它的优点是:1,可以提高程序的可读性,若程序中...

    关键字——inline

    inline关键字的前世

    个人理解,C++中inline关键字的出现可能与#define宏定义有关(define不是关键字)。因为#define宏定义在C语言中起到替换作用的,它的优点是:

    • 1,可以提高程序的可读性,若程序中多处用到了某一段代码时可以使用宏替换,当这段代码出错时方便修改。
    • 2,由于时直接替换,从而减少了系统的开销,提高了运行效率。 
      它也是有缺点的:
    • 1,增加代码量。
    • 2,由于是代码直接替换,并不会检查参数是否合法,替换时容易出错。
    • 3,出错不能调试宏。

    今生……

    inline是C++相对于C所独有的关键字,它的作用和C中的宏定义作用相似,但它不是替换,而是在函数调用时在调用点展开该函数,所以inline函数对于编译器而言必须是可见的。inline函数必须在调用该函数的每个文本文件中定义。它属于建议型关键字(使不使用inline机制编译器说了算)

    • 1,典型的以空间换取时间的方式,节省函数调用时的栈帧开销。
    • 2,如果函数体内有循环、递归时,编译器不会理会inline关键字,也就是说编译器这时不会听话的。
    • 3,inline关键字只在定义时起作用,在声明前不起作用。
    • 4,定义在类里面的成员函数默认是inline函数。
    • 5,这时宏函数可以用inline替换。
    展开全文
  • 主要介绍了C++ 关键字 inline,有需要的朋友可以参考一下
  • C语言关键字Inline

    2017-06-25 15:26:31
    C语言关键字Inline

    C语言关键字Inline

    Inline :提高了运行速度,但是会增加代码量(省去了调用函数的开销,但是包含的函数的代码量会增多

    1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。
    2. 很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
    3. inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。
    在何时使用inline函数:
    首先,你可以使用inline函数完全取代表达式形式的宏定义。
    另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。
    参考:http://huxiongwei.spaces.eepw.com.cn/articles/article/item/85841

    展开全文
  • C++关键字inline

    2018-01-19 21:24:47
    在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。 inline对于编译器而言,对...

    在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。

    inline对于编译器而言,对inline函数的处理步骤一般如下:

    (1)将inline函数体复制到inline函数调用点处;

    (2)为所用inline函数中的局部变量分配内存空间;

    (3)将inline函数的的输入参数和返回值映射到调用方法的局部变量空间中;

    (4)如果inline函数有多个返回点,将其转变为inline函数代码块末尾的分支(使用GOTO)。

    比如如下代码:

    //求0-9的平方
    inlineint inlineFunc(int num){  
      if(num>9||num<0)
          return -1
      return num*num;  
     
    int main(int argc,char* argv[]){
        int a=8;
        int res=inlineFunc(a);
    cout<<"res:"<<res<<endl;
    }

    inline之后的main函数代码类似于如下形式:

    int main(int argc,char* argv[]){
        int a=8;
        int _temp_b=8;  
        int _temp;  
        if (_temp_q >9||_temp_q<0) _temp = -1;  
         else _temp =_temp*_temp;  
        b = _temp;  
    inline函数相对宏函数有如下优点: 
    (1)内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度。
    (2)内联函数相比宏函数来说,在代码展开时,会做安全检查或自动类型转换(同普通函数),而宏定义则不会。 
    例如宏函数和内联函数:
    //宏函数
    #define MAX(ab) ((a)>(b)?(a):(b))
    //内联函数
    inline int MAX(int aint b){
        return a>b?a:b
    }

    使用宏函数时,其书写语法也较为苛刻,如果对宏函数出现如下错误的调用,MAX(a,"Hello"); 宏函数会错误地比较int和字符串,没有参数类型检查。但是使用内联函数的时候,会出现类型不匹配的编译错误。

    使用inline函数也要三思慎重。inline函数的缺点总结如下:

    (1)代码膨胀。inline函数带来的运行效率是典型的以空间换时间的做法。内联是以代码膨胀(复制)为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。

       (2)inline函数无法随着函数库升级而升级。

    如果f是函数库中的一个inline函数,使用它的用户会将f函数实体编译到他们的程序中。一旦函数库实现者改变f,所有用到f的程序都必须重新编译。如果f是non-inline的,用户程序只需重新连接即可。如果函数库采用的是动态连接,那这一升级的f函数可以不知不觉的被程序使用。

       (3)是否内联,程序员不可控。 
        inline函数只是对编译器的建议,是否对函数内联,决定权在于编译器。编译器认为调用某函数的开销相对该函数本身的开销而言微不足道或者不足以为之承担代码膨胀的后果则没必要内联该函数,若函数出现递归,有些编译器则不支持将其内联。

    inline函数的注意事项

    在使用内联函数时,我们也要注意以下几个事项和建议。

    (1)使用函数指针调用内联函数将会导致内联失败。 
        也就是说,如果使用函数指针来调用内联函数,那么就需要获取inline函数的地址。如果要取得一个inline函数的地址,编译器就必须为此函数产生一个函数实体,那么就内联失败。

    (2)如果函数体代码过长或者有多重循环语句,if或switch分支语句或递归时,不宜用内联。

    (3)类的constructors、destructors和虚函数往往不是inline函数的最佳选择。 
        类的构造函数(constructors)可能需要调用父类的构造函数,析构函数同样可能需要调用父类的析构函数,二者背后隐藏着大量的代码,不适合作为inline函数。虚函数(destructors)往往是运行时确定的,而inline是在编译时进行的,所以内联虚函数往往无效。如果直接用类的对象来使用虚函数,那么对有的编译器而言,也可起到优化作用。

    (4)至于内联函数是定义在头文件还是源文件的建议。 
        内联展开是在编译时进行的,只有链接的时候源文件之间才有关系。所以内联要想跨源文件必须把实现写在头文件里。如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。参考如下示例:

    // base.h
    class Base{protected:voidfun();};
    // base.cpp
    #include base.h
    inline void Base::fun(){}
    //derived.h
    #include base.h
    class Derived: public Base{public:voidg();};
    // derived.cpp
    void Derived::g(){fun();} //VC2010: error LNK2019: unresolved external symbol

    上面这种错误,就是因为内联函数fun()定义在编译单元base.cpp中,那么其他编译单元中调用fun()的地方将无法解析该符号,因为在编译单元base.cpp生成目标文件base.obj后,内联函数fun()已经被替换掉,编译器不会为fun()生成函数实体,链接器自然无法解析。所以如果一个inline函数会在多个源文件中被用到,那么必须把它定义在头文件中。

    这里有个问题,当在头文件中定义内联函数,那么被多个源文件包含时,如果编译器因为inline函数不适合被内联时,拒绝将inline函数进行内联处理,那么多个源文件在编译生成目标文件后都将各自保留一份inline函数的实体,这个时候程序在连接阶段就会出现重定义错误。解决办法是在需要inline的函数使用static。

    //test.h
    staticinlineint max(int a,int b){
        return a>b?a:b;
    }

        事实上,inline函数具有内部链接特性,所以如果实际上没有被内联处理,也不会报重定义错误,因此使用static修饰inline函数有点多余。

    (5)能否强制编译器进行内联操作? 
    也有人可能会觉得能否强制编译器进行函数内联,而不是建议编译器进行内联呢?很不幸的是目前还不能强制编译器进行函数内联,如果使用的是MSVC++, 注意__forceinline如同inine一样,也是一个用词不当的表现,它只是对编译器的建议比inline更加强烈,并不能强制编译器进行inline操作。

    (6)如何查看函数是否被内联处理了? 
    实际在VS2012中预处理了一下,查看预处理后的.i文件,inline函数的内联处理不是在预处理阶段,而是在编译阶段。编译源文件为汇编代码或者反汇编查看有没有相关的函数调用call,如果没有就是被inline了。具体可以参考here

    (7)C++类成员函数定义在类体内为什么不会报重定义错误? 
    类成员函数定义在类体内,并随着类的定义放在头文件中,当被不同的源文件包含,那么每个源文件都应该包含了类成员函数的实体,为何在链接的过程中不会报函数的重定义错误呢?

    原因是:在类里定义时,这种函数会被编译器编译成内联函数,在类外定义的函数则不会。内联函数的好处是加快程序的运行速度,缺点是会增加程序的尺寸。比较推荐的写法是把一个经常要用的而且实现起来比较简单的小型函数放到类里去定义,大型函数最好还是放到类外定义。

    可能存在的疑问:类体内的成员函数被编译器内联处理,但并不是所有的成员函数都会被内联处理,比如包含递归的成员函数。但是实际测试,将包含递归的成员函数定义在类体内,被不同的源文件包含并不会报重定义错误,为什么会这样呢?请保持着疑问与好奇心,请继续往下看。

    如果编译器发现被定义在类体内的成员函数无法被内联处理,也不会出现重定义的错误,因为C++中存在5种作用域的级别,分别是文件域(全局作用域)、命名空间域、类域、函数作用域和代码块作用域(局部域)。当类成员函数被定义在类体内,那么其作用域也就被限制在类域,当然定义在类体外的函数作用域也是属于类域的。显然并不是因为作用域的原因而不会产生重定义的错误。

    那么原因究竟是什么呢?其实很简单,类体内定义的成员函数就是inline函数,即使不被内联处理,inline函数的特性就是不具有外部连接性。所以并不会与其他源文件中的同名类域中的成员函数发生冲突,也就不会造成重定义的错误。

    6.小结

        可以将内联理解为C++中对于函数专有的宏,对于C的函数宏的一种改进。对于常量宏,C++提供const替代;而对于函数宏,C++提供的方案则是inline。C++ 通过内联机制,既具备宏代码的效率,又增加了安全性,还可以自由操作类的数据成员,算是一个比较完美的解决方案。

    展开全文
  • 内联函数-C中关键字inline用法解析

    万次阅读 多人点赞 2019-06-28 13:59:16
    目录 内联函数-C中关键字inline用法解析 内联函数-C中关键字inline用法解析 一、什么是内联函数 ​ 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 ​ 为了解决...

    内联函数-C中关键字inline用法解析

    一、什么是内联函数

    ​ 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。

    ​ 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。

    ​ 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。

    下面我们来看一个例子:

        #include <stdio.h>  
        //函数定义为inline即:内联函数  
    inline char* dbtest(int a) 
    {  
        return (i % 2 > 0) ? "奇" : "偶";  
    }   
    
    int main()  
    {  
        int i = 0;  
        for (i=1; i < 100; i++) 
        {  
            printf("i:%d    奇偶性:%s /n", i, dbtest(i));      
        }  
    }
    

    上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部任何调用dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

    ​ 其实这种有点类似咱们前面学习的动态库和静态库的问题,使 dbtest 函数中的代码直接被放到main 函数中,执行for 循环时,会不断调用这段代码,而不是不断地开辟一个函数栈。

    二、内联函数的编程风格

    1、关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。

    如下风格的函数Foo 不能成为内联函数:

    inline void Foo(int x, int y); // inline 仅与函数声明放在一起 void Foo(int x, int y) { }

    而如下风格的函数Foo 则成为内联函数:

    void Foo(int x, int y); inline void Foo(int x, int y) // inline 与函数定义体放在一起 { }

    ​ 所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。

    2、inline的使用是有所限制的

    ​ inline只适合涵数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。

    三、慎用内联

    ​ 内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?

    ​ 内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收

    获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。

    以下情况不宜使用内联:

    (1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

    (2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

    一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了inline 不应该出现在函数的声明中)。

    总结:

    ​ 因此,将内联函数放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦.而所以声明跟定义要一致,其实是指,如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为,即是说,如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定.所以,最好将内联函数定义放在头文件中.

    展开全文
  • 转:C++ 关键字 inline详细介绍 1. 内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: int max(int a, int b) { return a > b ? a : b; }   为...
  • 调用函数一般比求等价表达式的值要慢一些。在大多数的机器上,一次函数调用其实包含着一系列的工作:调用前...在函数的返回类型前面加上关键字Inline就可以将它声明成为内联函数了 在C++中,在类的设计中,类的成员...
  • 解析关键字inline

    2017-10-02 15:38:17
    大家都知道,inline是C++中新增加的关键字,意思是内联,内置,常用于修饰函数。 inline &lt;函数返回类型&gt; 函数名 (形参变量)为内置函数 一. 编译器对内联函数的处理 (1) 在实际情况下,编译器将它...
  • C语言关键字inline总结

    2017-10-15 17:41:24
    C语言中的inline关键字
  • C++ 关键字 inline 用法

    2017-12-23 10:28:50
    1、 引入inline关键字的原因  在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。栈空间就是指放置程序的局部数据(也就是函数内数据)的内存...
  • 关键字inline的作用

    千次阅读 2018-07-05 13:58:15
    1. 作为函数定义的关键字,说明该函数是内联函数。内联函数会将代码块嵌入到每个调用该函数的地方。内联函数减少了函数的调用,使代码执行的效力提高,但是会增加目标代码的大小,最终会使程序的代码段占有大量的...
  • C++关键字 inline

    2015-07-15 20:45:00
    一、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。 表达式形式的宏定义一例: #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2)) 取代这种形式的...
  • C中关键字inline用法

    2019-07-08 20:04:00
    在C语言中,如果一些函数被频繁的调用,不断地用函数入栈,即函数栈,则会造成栈空间或者栈内存的大量消耗,为了解决这个问题,特别的引入了inline关键字,表示为内联函数。栈空间指的是函数内数据的内存空间,在一...
  • GCC 关键字inline探究

    2016-03-09 06:10:44
    一、inline介绍 先看造型: inline int test() {  ......  return 0;...我们知道,如果test函数没有inline关键字修饰的时候,程序执行到调用test的时候,会从main函数跳到test函数执行。为了从
  • 【C++】关键字inline

    2018-12-08 11:07:00
    1. 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存...
  • C++ 关键字 inline

    千次阅读 2014-01-24 10:14:58
    尽管在大多数教科书中内联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格的一个基本原则:声明与...
  • 内联函数 —— C 中关键字 inline 用法解析

    万次阅读 多人点赞 2016-03-13 13:37:36
     在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗,为了解决,特别的引入了inline修饰符,表示为内联函数。  栈空间就是指放置程式的局部数据也就是函数内数据的...
  • 1、引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是放置程序的局部数据(也就是函数内数据)的内存空间...
  • 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式...
  • 内联inline是给编译器的优化提示,如果一个函数被编译成inline的话,那么就会把函数里面的代码直接插入到调用这个函数的地方,而不是用调用函数的形式。如果函数体代码很短的话,这样会比较有效率,因为调用函数的...
  • Ref C++ inline 函数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,216
精华内容 23,286
关键字:

关键字inline