精华内容
下载资源
问答
  • 内敛函数

    2020-10-04 21:45:05
    内联函数:在调用函数时相当于直接复制粘贴函数的语句 例: inline int add(int a,int b) { return a+b; } int main() { cout<<add(3,5)<<endl; //相当于cout<<3+5<<endl; } 优点:降低...

    内联函数:在调用函数时相当于直接复制粘贴函数的语句

    例:

    inline int add(int a,int b)
    {
    return a+b;
    }
    int main()
    {
    cout<<add(3,5)<<endl;
    //相当于cout<<3+5<<endl;
    }
    

    优点:降低调用函数的时间成本。
    缺点:多次定义内联函数会使函数变“臃肿”,消耗调用函数的栈空间。

    使用场合:
    1.函数代码只是简单且执行很快的语句。
    2.频繁使用的函数。

    展开全文
  • 在C++中,inline关键字和virtual关键字分别用来定义c++中的内联函数和虚函数,他们在各自的场合都有其各自的应用,下面将简单介绍他们各自的功能,然后在说明为什么一个函数不能同时是虚函数和内联函数(inline)...

    在C++中,inline关键字和virtual关键字分别用来定义c++中的内联函数和虚函数,他们在各自的场合都有其各自的应用,下面将简单介绍他们各自的功能,然后在说明为什么一个函数不能同时是虚函数和内联函数(inline)
    内联函数(inline)
                内联函数的目的是为了减少函数调用时间。它是把内联函数的函数体在编译器预处理的时候替换到函数调用处,这样代码运行到这里时候就不需要花时间去调用函数。但内联函数有个缺点是它会增加执行文件大小。所以如果不适当的使用内联函数会造成执行文件特别大。
             而使用内联函数有以下几点需要注意:
             头文件中不仅要包含inline函数的声明,还要包含inline函数的定义
             编译器需要把inline函数体替换到函数调用处,所以编译器必须要知道inline函数的函数体是啥,所以要将inline函数的函数定 义和函数声明一起写在头文件中,便与编译器查找替换。
             可以在同一个项目的不同源文件内定义函数名相同,实现相同的inline函数
             同一个inline函数可以多处声明和定义,但是必须要完全相同
             定义在class声明内的成员函数默认是inline函数
    虚函数(virtual)
    虚函数是为了实现多态特性的。虚函数的调用只有在程序运行的时候才能知道到底调用的是哪个函数,其是有有如下几点需要注意:
            类的构造函数不能是虚函数。构造函数是为了构造对象的,所以在调用构造函数时候必然知道是哪个对象调用了构造函数,所以构造函数不能为虚函数。
            类的静态成员函数不能是虚函数。类的静态成员函数是该类共用的,与该类的对象无关,静态函数里没有this指针,所以不能为虚函数。
           虚函数不能定义为内联函数的原因
    inline是在编译器将函数类容替换到函数调用处,是静态编译的。而虚函数是动态调用的,在编译器并不知道需要调用的是父类还是子类的虚函数,所以不能够inline声明展开,所以编译器会忽略

    总结
            使用inline关键字的函数可能会被编译器忽略而不在调用处展开,如虚函数。
            如果定义的inline函数过大,为了防止生成的obj文件太大,编译器会忽略这里的inline声明
            inline是在编译器将函数类容替换到函数调用处,是静态编译的。而虚函数是动态调用的,在编译器并不知道需要调用的是父类还是子类的虚函数,所以不能够inline声明展开,所以编译器会忽略
          头文件中不仅要包含inline函数的声明,还要包含inline函数的定义
            编译器需要把inline函数体替换到函数调用处,所以编译器必须要知道inline函数的函数体是啥,所以要将inline函数的函数定义和函数声明一起写在头文件中,便与编译器查找替换。
           可以在同一个项目的不同源文件内定义函数名相同,实现相同的inline函数
           同一个inline函数可以多处声明和定义,但是必须要完全相同
           定义在class声明内的成员函数默认是inline函数
            类的构造函数不能是虚函数
    构造函数是为了构造对象的,所以在调用构造函数时候必然知道是哪个对象调用了构造函数,所以构造函数不能为虚函数。
           类的静态成员函数不能是虚函数
    类的静态成员函数是该类共用的,与该类的对象无关,静态函数里没有this指针,所以不能为虚函数。

    虚函数是为了实现动态绑定,不能声明为虚函数的有:
    1、静态成员函数; 2、类外的普通函数; 3、构造函数; 4、友元函数
    此外,还有一些函数可以声明为虚函数,但是没有意义,但编译器不会报错,如:
    1、赋值运算符的重载成员函数: 因为复制操作符的重载函数往往要求形参与类本身的类型一致才能实现函数功能,故形参类型往往是基类的类型,因此即使声明为虚函数,也把虚函数当普通基类普通函数使用。
    2、内联函数:内联函数目的是在代码中直接展开(编译期),而虚函数是为了继承后能动态绑定执行自己的动作(动态绑定),因此本质是矛盾的,因此即使内联函数声明为虚函数,编译器遇到这种情况是不会进行inline展开的,而是当作普通函数来处理。因此声明了虚函数不能实现内敛的,即内敛函数可以声明为虚函数,但是毫无了内联的意义
     

    类内部定义的所有函数(虚函数除外)都被隐式或自动认为是内联的

    使用类的引用或指针调用虚函数时,无论虚函数什么时间被调用,它都不能是内联的(因为虚函数的调用在运行时确定);但是,使用类的对象调用虚函数时,无论虚函数什么时间被调用,它都可以是内联的(因为在编译时编译器知道对象的确定类型)
     

    展开全文
  • 关于内敛函数

    2018-08-06 22:02:06
    使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。 头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义...

    使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。

    头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】

     inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。

    类内的成员函数,默认都是 inline 的。【定义在类声明之中的成员函数将自动地成为内联函数】

    EF 项无意思,不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题,因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的

    展开全文
  • 内敛函数的缺点 六.使用内联函数时需要注意的事项 一.什么是内联函数 例如现在有如下一个函数 int sum(int x,int y) { return x+y; } 虽然这个函数只有短短的三行,但当调用它时,会进行参数压栈,函数栈帧...

    目录

    一.什么是内联函数

    二.内联函数和宏的区别

    三.内联函数和static修饰的函数的区别

    四.使用inline的时机

    五.内敛函数的缺点

    六.使用内联函数时需要注意的事项


    一.什么是内联函数

    例如现在有如下一个函数

    int sum(int x,int y)
    {    
        return x+y;
    }

    虽然这个函数只有短短的三行,但当调用它时,会进行参数压栈,函数栈帧的开辟和回退过程,这会给系统带来很大的开销。因此我们可以使用内联函数。

    inline int sum(int x,int y)
    {    
        return x+y;
    }

    所谓的内联函数指的是,在函数的调用点直接把函数的代码展开,并且这一过程中没有其他符号产生,从而提升了整个程序的运行效率。而这一过程是在编译间段进行的。

    还需特别注意的是,不是所有被inline修饰的函数都会被编译器当做内联函数来处理,例如递归。

    二.内联函数和宏的区别

    1.内联函数

    • 处理时机:编译间段。
    • 作用:进行代码展开,有安全检查和类型检查,可以理解为一种更安全的宏。

    2.宏

    • 处理时机:预编译间段。
    • 作用:文本替换,没有安全检查和类型检查。

    三.内联函数和static修饰的函数的区别

    1.内联函数

    • 没有开栈和清栈的开销
    • 直接在调用点把代码展开 

    2. static修饰的函数

    • 有开栈和清栈的开销
    • 把属性设为local

    四.使用inline的时机

    • 开栈清栈的开销 > 执行的开销 ---> 函数体较小,建议写为inline函数
    • 开栈清栈的开销 < 执行的开销 ---> 函数体较大,不建议写为inline函数

    五.内敛函数的缺点

    1. 编译时,编译器不知道形参的值,无法知道递归和循环运行的次数。
    2. 内联函数只在release版本生效,在debug版本不生效。
    3. 内联函数是基于实现的,不是基于声明的。
    4. 以代码膨胀为代价,以空间换时间。 

    六.使用内联函数时需要注意的事项

    1.内联函数只是给编译器的一个建议,即最终是否将某个函数当为内联函数来处理是由编译器来决定的。

    2.内敛函数只能写在头文件中。

    内联函数发生上面那种替换是在编译期间,在编译期间编译器为了找到需要找到内联函数的定义,所以在为了方便编译器找到定义,每个文件引用头文件后,都直接拥有这种定义,而不用再去写。而普通函数可以申明和定义分离,主要是编译阶段就不需要函数定义。首先编译阶段找到函数的申明,链接阶段才会去找函数的定义,将之关联起来。

    inline函数的特征是在调用的地方插入相应函数的代码,所以编译之后的目标文件里是没有inline函数体的,因为在要调用的地方它都已经用相应的语句替换掉了(当然这只限于内联成功的情况)。
    如果我们将inline函数写在cpp文件里,但是绝大多数情况下,在我们用第三方类库的时候,我们只有头文件和目标文件(没有cpp文件),当你调用那个内联函数时,编译器没办法找到它。所以说将inline函数写在cpp文件中是没什么用的。

    3.内联函数只在本文件中可见。

     

    展开全文
  • 内敛函数(inline函数)

    千次阅读 2014-02-24 16:36:21
    内敛函数(inline函数) 内敛函数一般规模较小,程序再调用这些成员函数时,不是真正的执行函数的调用过程(如保存返回地址等处理),而是把函数代码嵌入程序的调用点(内敛函数在源文件中不是调用而是按原样展开),...
  • 内敛函数的理解

    2021-12-02 21:21:35
    目的:引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数函数体进行替换,而对于其他的函数,都是在运行时候才被...
  • 内敛函数inline

    2016-11-30 16:55:45
    函数的引入可以减少程序的目标代码,实现程序代码的共享。 函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返 回到调用的地方。这种调用操作要求调用前...
  • 内敛函数 函数想必大家熟悉的不能再熟悉了,那我们先来看看这个函数 #include<iostream> using namespace std; int add(int a,int b) { return a + b; } int main() { int num1 = 10; int num2 = 20; int ...
  • c++中的内敛函数inline

    2018-03-27 20:16:28
    //内联函数inline#include&lt;iostream&gt; using namespace std; inline void printA() {//inline void printA()和函数体的实现写在一块,也就是不能提前声明 int a = 10; cout &lt;&lt; a &...
  • #include using namespace std; #define CDLA(a,b) a+b inline int add(int a, int b) { return a + b; } void main() { int a, b, resu; cout cin >> a >> b; resu = add(a, b);...cou
  • 内敛函数(inline函数) 编译阶段,在代码的调用点直接将代码展开。 1.inline函数和static修饰的函数的区别 1、inline函数 没有开栈和清栈的开销 static 有 2、inline函数 在调用点直接代码展开 stat...
  • 内敛函数的分析

    2021-11-18 23:07:28
    内敛函数 C++中推荐使用内敛函数替代宏片段片段 C++中使用inline关键字声明内敛函数 inline int func(int a, int b) { return a < b ? a : b; } 内敛函数声明时inline关键字必须和函数定义结合在一起,否则...
  • 内敛函数宏定义差别

    2017-05-28 21:35:00
    内敛函数(inline函数) 内敛函数一般规模较小,程序再调用这些成员函数时。不是真正的运行函数的调用过程(如保存返回地址等处理)。而是把函数代码嵌入程序的调用点(内敛函数在源文件里不是调用而是按原样展开),...
  • 内敛函数可以内敛函数一般规模较小,程序再调用这些成员函数时,是把函数代码嵌入程序的调用点(内敛函数在源文件中不是调用而是按原样展开),这样可以大大减少调用成员函数的时间。事实上我们可以用内联函数完全...
  • 内敛函数内敛函数1.为什么有内敛函数2.内敛函数使用3.内联函数特性、注意事项4.宏函数的优缺点auto关键字1.auto 的定义2.auto的使用3.auto使用注意事项4.auto使用细则范围for循环1.范围for循环的使用规范2.范围for...
  • 1 带默认值参数的函数: 首先,默认值参数的传递是自右向左,默认值参数并不影响压栈指令的生成(push指令); 若默认值参数是立即数,则是否带默认值参数的效率无差别,带默认值参数的函数压栈的时候永远压的是立即...
  • 内敛函数的异常接口声明为什么不可以以及异常借口是什么
  • 介绍了java的小程序,以及学生考试的算法
  • 内敛函数宏定义区别

    千次阅读 2014-10-12 10:11:36
    内敛函数(inline函数) 内敛函数一般规模较小,程序再调用这些成员函数时,不是真正的执行函数的调用过程(如保存返回地址等处理),而是把函数代码嵌入程序的调用点(内敛函数在源文件中不是调用而是按原样展开),...
  • 检查函数,确定它不具有多态性(如果子类继承了这个函数,就不要将此函数内敛,因为子类无法覆写一个根本不存在的函数)。 找出找个函数的所有被调用点。 将找个函数的所有被调用点都替换为函数本体。 编译,测试。 ...
  • 内敛函数 inline 继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数、返回值类型的安全检查,又可以作为成员函数 问题一 #define ADD(x,y) x+y inline int Add(int x,int y) { ...
  • ⭐️今天·这篇博客我要来和大家一起聊一聊初始C++中一些新的知识,引用和内敛等,希望对大家有所帮助。 ⭐️博客代码已上传至gitee:https://gitee.com/byte-binxin/cpp-class-code/tree/master 目录????引用????...
  • 1、函数的默认参数 2、函数的重载 (1)在相同的作用域内,用同一个函数名定义的多个函数,其中每个函数的参数个数、参数类型不同。 3、内联函数 (1)编译的时候,将函数体代码和相应的实参直接在函数调用...
  • 二:内敛函数 三:auto关键字 四:基于范围for循环 五: 指针空值nullptr 一:引用: 1.1:引用的概念 引用不是新定义一个变量,而是给已存在的变量去一个别名,编译器也不会为引用变量而开辟空间,它和它引用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,624
精华内容 1,049
关键字:

内敛函数