精华内容
下载资源
问答
  • #include 函数对象FunctionObjectType fo;...类型;速度比function pointor更快。例程中,async要调用函数,我们实现了多种调用方式。f1:函数对象是新建出来的;f2:调用了print函数指针,并传入了参数;f3:使用l...
    #include 

    函数对象

    FunctionObjectType fo;//定义一个变量
    fo(...)//调用operator()

    函数是一个对象,并不是一个简单的函数指针:void fo(...)。

    1. 拥有状态;
    2. 有类型;
    3. 速度比function pointor更快。

    例程中,async要调用函数,我们实现了多种调用方式。

    • f1:函数对象是新建出来的;
    • f2:调用了print函数指针,并传入了参数;
    • f3:使用lamda作为函数参数,引用了b;
    • f4:直接把函数对象传入;
    • f5:调用成员函数,给出了哪个成员函数,哪个对象的成员函数,及成员函数需要的参数。

    LAMDA

    C++11 Lambda函数 - WindSun - 博客园​www.cnblogs.com
    db08651ccac376de5eda0c6f22d2004f.png

    5a7437fa7e4768e676c0947821ed0060.png

    [捕捉列表] (参数) mutable -> 返回值类型 {函数体}

    auto	

    上例展示如何使用[=]以捕获父域所有对象的拷贝。

    可以把a赋值给e,但是不能直接使用a.print()。

    上例还展示了如何明确指出返回值的数据类型。

    Lambda与STL

      从C++11开始,Lambda被广泛用在STL中,比如foreach。与函数指针比起来,函数指针有巨大的缺陷:

    1.函数定义在别处,阅读起来很困难;

    2.使用函数指针,很可能导致编译器不对其进行inline优化,循环次数太多时,函数指针和Lambda比起来性能差距太大。函数指针不能应用在一些运行时才能决定的状态,在没有C++11时,只能用函数对象。使得学习STL算法的代价大大降低。

    但是Lambda并不是仿函数的完全代替者。由Lambda的捕捉列表的限制造成的,仅能捕捉副作用域的变量。放函数具有天生跨作用域共享的特征。

    展开全文
  •   C++在调用函数时,会执行一系列的操作:将参数push到堆栈中将返回地址push到堆栈中准备返回值将所有push到堆栈的东西都pop出来  这一系列的操作无疑增加了延迟,inline函数就是把函数内容嵌入到函数调用的地方...

    1. 什么是内联函数?

      就是使用了关键字inline的函数,如

    inline int max(int a, int b){

    2. 内联函数有什么作用?

      C++在调用函数时,会执行一系列的操作:

    • 将参数push到堆栈中

    • 将返回地址push到堆栈中

    • 准备返回值

    • 将所有push到堆栈的东西都pop出来

      这一系列的操作无疑增加了延迟,inline函数就是把函数内容嵌入到函数调用的地方,但仍然保持函数的独立性(即函数有自己的空间)。

    int main(){

    在使用inline之后,上面的代码在执行过程中,跟下面的代码是一样的:

    int main(){

    3. 如何使用内联函数?

      内联函数跟普通函数的使用方式有所不同,内联函数的声明和定义不能分开在不同的文件,即都要在同一个文件中,因此我们在使用时,直接在头文件中定义出inline函数即可。

    inline int max(int a, int b) { 

      看到这里,很多同学就会觉得inline跟宏定义的用法很像,比如下面这个例子:

    Example1:

    #define f(x) x*x

    Example2:

    inline int f(int x) { 

    这两段代码都会产生warning,但第一个代码输出结果是错的,第二个输出结果的对的。这是为什么呢?因为宏定义不会做类型检查,f(x)的结果是一个double型的,而我们用%d来打印,结果肯定是不对的;而第二个代码中,x是double型,但函数f的参数类型是int型,因此会先进行类型转换后,再进行x*x的操作。

    4. 注意事项

    • 如果我们的内联函数过于巨大,那编译器不会将其编译成内联函数;

    • 内联函数中有太多循环,编译器也不会将其编译成内联函数;

    • 递归函数不能是内联函数;

    • 如果class的成员函数,在声明时就给出了函数的body,即函数定义,那这些函数都是inline的;如果在成员函数声明时,并没有直接给出body,而是在下面定义成员函数时使用`inline关键字,这样即可以保持class的定义比较干净,还可以使函数类型为inline

    5. 是否需要inline

    什么时候需要inline?

    • 当函数比较小的时候,比如只有几行代码,建议使用inline

    • 当被循环调用时,建议使用inline

    什么时候不需要inline?

    • 当函数超过20行后,就不要再做inline 了

    • 递归函数不能用inline

    往期文章:

    • C++ vector用法详解

    • SystemVerilog教程之数据类型1

    • Vivado中模块封装成edif和dcp

    • 自动驾驶入门之视觉定位坐标转换

    • 什么是噪声温度?-174dBm/Hz又是什么?

    • FPGA 中的有符号数乘法

    • 为什么推荐使用XPM?

    •  RAM IP Core中 Write First Read First和No Change的区别

    •  Vivado调试小结:ILA debug中的数据也许并不可信

    • FPGA复位的正确打开方式

    • 如何使用Git进行Vivado工程的管理

    • 大家一致避免使用的锁存器为什么依然存在于FPGA中?我们对锁存器有什么误解?

    • 影响FPGA时序的进位链(Carry Chain), 你用对了么??

    • Virtex7 Microblaze下DDR3测试

    • Matlab高效编程技巧

    • 生成Verilog HDL例化模板

    • DCM/DLL/PLL/MMCM区别

    FPGA时序约束教程:

    1. FPGA时序约束理论篇之建立保持时间

    2. FPGA时序约束理论篇之时序路径与时序模型

       3. FPGA时序约束理论篇之IO约束

       4. FPGA时序约束理论篇之时钟周期约束

       5. FPGA时序约束理论篇之两种时序例外

       6. FPGA时序约束理论篇之xdc约束优先级

       7. FPGA时序约束实战篇之梳理时钟树

       8. FPGA时序约束实战篇之主时钟约束

       9. FPGA时序约束实战篇之衍生时钟约束

      10. FPGA时序约束实战篇之延迟约束

      11. FPGA时序约束实战篇之伪路径约束

      12. FPGA时序约束实战篇之多周期路径约束

      13. Vivado时序约束辅助工具

      14. FPGA时序约束之Tcl命令的对象及属性

    欢迎关注微信公众号:

    2bf5e9dd42926951f9038cae5fecb47d.png

    加FPGA技术交流群的朋友,请加微信:xhclsys2

    展开全文
  • https://www.cnblogs.com/QG-whz/p/4641479.html阅读目录什么是内联函数如何使函数内联为什么要使用内联函数inline函数的优缺点分析什么时候该使用内联函数在C语言中,我们使用宏定义函数这种借助编译器的优化技术来...

    作者:melonstreet 

    链接:https://www.cnblogs.com/QG-whz/p/4641479.html

    阅读目录

    • 什么是内联函数

    • 如何使函数内联

    • 为什么要使用内联函数

    • inline函数的优缺点分析

    • 什么时候该使用内联函数

    在C语言中,我们使用宏定义函数这种借助编译器的优化技术来减少程序的执行时间,那么在C++中有没有相同的技术或者更好的实现方法呢?答案是有的,那就是内联函数。内联函数作为编译器优化手段的一种技术,在降低运行时间上非常有用。我们将从:

    1、什么是内联函数

    2、为什么要使用内联函数

    3、内联函数优缺点分析

    4、何时使用内联函数

    这四个方面对内联函数进行介绍。

    什么是内联函数

    内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。

    值得注意的是,内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如何函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。

    如何使函数内联

    定义函数时,在函数的最前面以关键字“inline”声明函数,即可使函数称为内联声明函数。

    Class A
    {
     Public:
        inline int add(int a, int b){
           return (a + b);
        };
    }

    Class A
    {
     Public:
        int add(int a, int b);
    };

    inline int A::add(int a, int b)
    {
       return (a + b);
    }

    为什么要使用内联函数

    有时候我们会写一些功能专一的函数,这些函数的函数体不大,包含了很少的执行语句。例如在计算1~1000以内的素数时,我们经常会使用开方操作使运算范围缩小,这时我们会写一个函数:

    int root(int n){

    然后我们的求范围内素数的函数可以这样写。

    int prime(int n){

     当然,把root函数放在循环中不是个不明智的选择,但想象一下,在某个程序上下文内必须频繁地调用某个类似root的函数,其调用函数的花销会有多大:当遇到普通函数的调用指令时,程序会保存当前函数的执行现场,将函数中的局部变量以及函数地址压入堆栈,然后再将即将调用的新函数加载到内存中,这要经历复制参数值、跳转到所调用函数的内存位置、执行函数代码、存储函数返回值等过程,当函数执行完后,再获取之前正在调用的函数的地址,回去继续执行那个函数,运行时间开销简直太多了。

    C++内联函数提供了替代函数调用的方案,通过inline声明,编译器首先在函数调用处使用函数体本身语句替换了函数调用语句,然后编译替换后的代码。因此,通过内联函数,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场数据。

    inline函数的优缺点分析

    通过下面这些优缺点总结你大概会更理解为什么要使用inline函数:

    优点:

    1、它通过避免函数调用所带来的开销来提高你程序的运行速度。

    2、当函数调用发生时,它节省了变量弹栈、压栈的开销。

    4、它避免了一个函数执行完返回原现场的开销。

    4、通过将函数声明为内联,你可以把函数定义放在头文件内。

    缺点:

    1、因为代码的扩展,内联函数增大了可执行程序的体积。

    2、C++内联函数的展开是中编译阶段,这就意味着如果你的内联函数发生了改动,那么就需要重新编译代码。

    3、当你把内联函数放在头文件中时,它将会使你的头文件信息变多,不过头文件的使用者不用在意这些。

    4、有时候内联函数并不受到青睐,比如在嵌入式系统中,嵌入式系统的存储约束可能不允许体积很大的可执行程序。

    什么时候该使用内联函数

    当程序设计需要时,每个函数都可以声明为inline。下面列举一些有用的建议:

    1、当对程序执行性能有要求时,那么就使用内联函数吧。

    2、当你想宏定义一个函数时,那就果断使用内联函数吧。

    3、在类内部定义的函数会默认声明为inline函数,这有利于 类实现细节的隐藏。

    关键点

    1、内联声明只是一种对编译器的建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开。

    2、编译器的内联看起来就像是代码的复制与粘贴,这与预处理宏是很不同的:宏是强制的内联展开,可能将会污染所有的命名空间与代码,将为程序的调试带来困难。

    3、所有中类中定义的函数都默认声明为inline函数,所有我们不用显示地去声明inline。

    4、虚函数不允许内联。

    5、虽然说模板函数放中头文件中,但它们不一定是内联的。(不是说定义在头文件中的函数都是内联函数)。


    ●编号594,输入编号直达本文

    ●输入m获取文章目录

    C语言与C++编程

    a03e63eb7619aaa9fd3d112f1b0153b0.png

    分享C/C++技术文章

    展开全文
  • 然后,CPU执行函数代码,将函数返回值存储在预定义的内存位置/寄存器中,并将控制权返回给调用函数。如果函数的执行时间少于从调用者函数到被调用函数(被调用者)的切换时间,则这可能会成为开销。对于大型函数和/...

    87e1b1bf3349292d40dd1140c584892e.png

    当程序执行函数调用指令时,CPU将存储该函数调用后指令的内存地址,将函数的参数复制到堆栈上,最后将控制权转移到指定的函数。然后,CPU执行函数代码,将函数返回值存储在预定义的内存位置/寄存器中,并将控制权返回给调用函数。如果函数的执行时间少于从调用者函数到被调用函数(被调用者)的切换时间,则这可能会成为开销。对于大型函数和/或执行复杂任务的函数,与函数运行所花费的时间相比,函数调用的开销通常微不足道。但是,对于小型的常用功能,进行函数调用所需的时间通常比实际执行函数代码所需的时间多得多。对于小功能,由于小功能的执行时间少于切换时间,因此会产生开销。

    C++提供了inline函数,以减少函数调用的开销。内联函数是在调用时在行中扩展的函数。调用内联函数时,将在内联函数调用时插入或替换内联函数的整个代码。替换由C++编译器在编译时执行。如果内联函数很小,则可以提高效率。

    inline函数看起来像函数,动作像函数,但是又比宏方便很多,调用inline函数省去了参数压栈、生成汇编语言的 CALL调用、返回参数、执行return等过程所花费的额外开销。不过inline函数也有缺点:增加目标码的大小。因为inline函数的设计思想是对该函数的所有调用都用函数本身替换掉,和宏定义一样,但是比宏定义用起来要简单很多。而且inline的调试同样很难。

    所以,inline函数对于函数体积很小,却又频繁调用这样的函数来说,可能比函数调用产生的代码更少,但是效率却不可同日而语。有一点需要注意的是:inline只是对编译器提出一个申请,并不是强制命令。编译器可以忽略内联请求。 在以下情况下,编译器可能不会执行内联:

    • 如果函数包含循环。(对于while,do-while)
    • 如果函数包含静态变量。
    • 如果函数是递归的。
    • 如果函数的返回类型不是void,并且函数主体中不存在return语句。
    • 如果函数包含switch或goto语句。

    inline可以显示声明,也可以隐式声明。隐式声明方式是将函数定义在类定义之中(函数定义时没有inline关键字),编译器也会当作inline函数。另外,定义在类中的friend函数也会被隐式声明为inline函数。

    显式声明的时候必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。定义函数内联的语法为:

    inline 

    此外,inline函数通常放在头文件中,因为大多数build environments在编译期进行inlining,编译器必须知道函数什么样子才能把函数调用替换成函数本体

    大多数virtual函数不能inlining:因为virtual直到运行时才知道调用哪个函数,而inline是在执行前进行替换。此外,对于通过函数指针进行的调用编译器通常不会inlining,下面是一个实例:

    inline 

    内联函数的优点:

    1. 不会发生函数调用开销。
    2. 调用函数时,还节省了push / pop变量在栈上的开销。
    3. 它还节省了从函数返回调用的开销。
    4. 内联函数时,可以使编译器对函数主体执行特定于上下文的优化。对于正常的函数调用,这种优化是不可能的。通过考虑调用上下文和被调用上下文的流程可以获得其他优化。
    5. 内联函数可能对于嵌入式系统有用(如果很小),因为内联函数所产生的代码少于函数调用的前导和返回。

    内联函数的缺点:

    1. 内联函数中添加的变量消耗了额外的寄存器,在内联函数之后,如果要使用寄存器的变量编号增加,则它们可能会增加寄存器变量资源利用的开销。这意味着当在函数调用点替换内联函数主体时,该函数使用的变量总数也会被插入。因此,将用于变量的寄存器数量也将增加。因此,如果函数内联后的变量数急剧增加,则肯定会导致寄存器利用率增加。
    2. 如果使用太多的内联函数,则由于重复执行相同的代码,二进制可执行文件的大小将很大。
    3. 过多的内联也会降低指令Cache命中率,从而降低了从高速缓存到主存储器的指令获取速度。
    4. 如果有人更改了内联函数中的代码,则内联函数可能会增加编译时间开销,然后必须重新编译所有调用位置,这是因为编译器将需要再次替换所有代码以反映更改,否则它将继续使用旧功能。
    5. 内联函数对于许多嵌入式系统可能没有用。因为在嵌入式系统中,代码大小比速度更重要。
    6. 内联函数可能会导致崩溃,因为内联可能会增加二进制可执行文件的大小。内存溢出会导致计算机性能下降。

    Note:

    • 将大多数内联限制在小的,经常调用的函数中。这有助于调试和二进制可升级性,最大程度地减少潜在的代码膨胀,并最大程度地提高程序速度。
    • 不要仅仅因为函数模板出现在头文件中就声明inline。

    Reference

    Effective C++

    https://www.geeksforgeeks.org/inline-functions-cpp/

    展开全文
  • 然后,CPU执行功能代码,将功能返回值存储在预定义的存储位置/寄存器中,并将控制权返回给调用函数。如果函数的执行时间少于从调用者函数到被调用函数(被调用者)的切换时间,则这可能会成为开销...
  • 修订日期:2020/9/6C++的运作实质是,C++是一种高级语言,编译器会对C++的代码进行处理,变成...函数是C++的一个重要分支,当我们调用一个函数的时候,比如 do_it(a,b); 这样简单的一句话,首先a和b作为参数会被保...
  • F# 的inline 和计算表达式可以帮我实现这个梦想。我们来研究一下对策,首先,表达式的结果必须是一个函数,它的参数也是一个函数函数标签为('t -> 'r)。我们把记录状态的函数命名为 trans,把它的参数命名为 ...
  • 1、函数的定义 函数在使用之前需要预先定义,定义函数的语法为:...如果函数不需要返回值则使用void作为类型声明。比如下面定义的square()函数用于求整数类型的平方:int 2、函数的使用 在使用之前必须预先定义或者...
  • 本篇要学习的内容和知识结构概览函数的参数及其传递方式1. 函数参数传递方式传值: 传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存 传地址值: 将实参所对应的内存空间的地址值给形参, 形参是一...
  • 本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题:一、C++为什么引入inline函数?主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题。C语言中的宏定义:#...
  • inline函数

    千次阅读 2019-05-18 14:47:39
    什么是inline函数 一个函数的程序进行代码拓展而不被调用,用相应的函数代码替换函数调用。 引入inline函数的原因 系统中会这样的场景:for循环调用一个处理函数或则是递归调用一些算法。因为调用一个任意函数...
  • 嵌入式Linux:C++ 面试准备珍藏版本​zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)​...- hongcha_717 - 博客园​www.cnblogs.com 链接: define和inline有什么区别?__牛客网​www.nowcoder.com
  • const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。 const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++...
  • inline概念在c++中,函数调用是会产生额外的时间开销的,如果函数本身代码很短,执行很快,并且该函数被反复调用。相比之下调用函数所产生的开销就会很大,甚至超过执行代码所产生的开销。为了减少函数调用的开销,...
  • C++中inline函数详解

    2020-12-31 11:26:43
    本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题: 一、C++为什么引入inline函数? 主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题。 C语言中的宏定义:#...
  • C++inline函数简介

    2019-06-03 09:36:13
    1.inline函数简介 inline函数是由inline关键字来定义,引入inline函数的主要原因是用它替代C中复杂易错不易维护的宏函数。 inline(小心,不是online),翻译成“内联”或“内嵌”。意指:当编译器发现某段代码在...
  • C++ inline 函数简介

    万次阅读 多人点赞 2016-07-31 22:39:37
    1.inline函数简介 inline函数是由inline关键字来定义,引入inline函数的主要原因是用它替代C中复杂易错不易维护的宏函数。 2.编译器对inline函数的处理办法 inline对于编译器而言,在编译阶段完成对...
  • 虚函数 inline函数

    2014-05-20 15:40:45
    一、首先回顾下什么是虚函数及其作用,以便更好理解什么函数不能声明或... virtual 函数返回值类型 虚函数名(形参表) { 函数体 } 2. 作用: 虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合
  • inline函数用法详解

    万次阅读 多人点赞 2017-07-03 09:17:26
    inline函数定义 内联函数的编程风格 慎用内联 inline 和 预处理的区别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,389
精华内容 19,355
关键字:

有返回值的inline函数