内联函数

author author     2022-11-10     503

关键词:

        或许我们在 C 语言中听说过内联函数,但是内联函数是首先在 C++ 中提出来的,可能现代的 C 编译器支持内联函数。

        C++ 中的 const 常量可以代替宏常数定义,如:const int A = 3; <==> #define A 3;那么在 C++ 中是否有解决方案代替宏代码片段呢?在 C++ 中推荐使用内联函数替代宏代码片段,使用 inline 关键字声明内联函数。内联函数声明时 inline 关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

        C++ 编译器可以将一个函数进行内联编译,被 C++ 编译器内联编译的函数叫做内联函数;C++ 编译器直接将函数插入函数调用的地方,内联函数没有普通函数调用时的额外开销(压栈,跳转,返回等);但 C++ 编译器不一定会满足函数的内联请求!

        我们以代码为例来进行分析

#include <stdio.h>

#define FUNC(a, b) ((a) < (b) ? (a) : (b))

inline int func(int a, int b)

    return a < b ? a : b;


int main(int argc, char *argv[])

    int a = 1;
    int b = 3;
    int c = FUNC(++a, b);
    
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    
    return 0;

        我们在第 3 行定义了宏函数,返回两个数中的较小值;在第 5 行定义函数返回较小值。我们先用宏函数来返回,在第 14 行比较 ++a 和 b 的值,明显返回的是 2,那么最后的值就为 a = 2, b = 3, c = 2;我们来看看结果

技术分享图片

        我们看到的是返回的是 3,仔细看下程序,我们调用的是宏函数,也就是说,这个 ++a 被执行了两次,所以返回 3 很正常。我们再来把宏函数调用换成函数调用,看看结果

技术分享图片

        我们看到这次和我们分析的是一致的啦,那么宏函数和函数还是有区别的,宏函数有弊端。

        下来我们来讲讲内联函数,内联函数具有普通函数的特征(参数检查,返回类型等);函数的内联请求可能会被编译器拒绝;函数被内联编译后,函数体直接扩展到调用的地方;宏代码片段由预处理器处理,进行简单的文本替换,没有任何的编译过程,因此可能出现副作用

        现代 C++ 编译器能够进行编译优化,一些函数即使没有 inline 声明,也可能被内联编译;一些现代的 C++ 编译器通过了扩展语法,能够对函数进行强制内联,如:g++:__attribute__((always_inline))属性; MSVC:__forcrinline

        下来我们以代码为例进行分析

#include <stdio.h>


inline 
int add_inline(int n);

int main(int argc, char *argv[])

    int r = add_inline(10);

    printf(" r = %d\n", r);

    return 0;


inline int add_inline(int n)

    int ret = 0;

    for(int i=0; i<n; i++)
    
        ret += i;
    

    return ret;

        我们在 VS2010 中通过断点调试进到反汇编,看看内联函数生效了没。在第 8 行通过调用内联函数 add_inline,我们看到汇编函数如下

技术分享图片

        我们看到有 call 的调用,证明内联请求失败了。还是调用了函数,并没有在这块直接把函数体铺开。这也证明了我们之前所说的不是每一个内联请求都会得到执行。

        在 C++ 中 inline 内联编译有这么几种条件限制:a> 不能存在任何形式的循环语句;b> 不能存在过多的条件判断语句;c> 函数体不能过于庞大;d> 不能对函数进行取址操作;e> 函数内联声明必须在函数调用语句之前;

        通过对内联函数的学习,总结如下:1、C++ 中可以通过 inline 声明内联函数;2、编译器直接将内联函数体扩展到函数调用的地方;3、inline 只是一种请求,编译器不一定允许这种请求;4、内联函数省去了函数调用时压栈、跳转和返回的开销。


        欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083

虚函数可以是内联函数吗?

...,通过虚函数表来确定调用的函数,在运行时确定。  内联函数是在编译时,将调用函数处插入内联函数的代码,省去了函数调用时的开销。  表面上看,虚函数不能为内联函数。我们在类中定义的函数都是内联函数,析构... 查看详情

内联函数

1、内联函数是相对于宏函数而言的,为什么使用宏函数,原因是,宏函数只在预处理时进行简单的替换,没有函数调用的开销,压栈,跳转,返回,提高程序性能。对于一些短小而频繁使用的函数,可以使用内联函数。2、普通... 查看详情

第2章重新组织函数:内联函数和内联临时变量

2.内联函数(InlineMethod)2.1动机(1)在函数调用点插入函数本体,然后移除该函数。(2)有时遇到某些函数,其内部代码和函数名称同样清晰易读,采用内联函数可以提供代码的执行速度(因为少掉了函数调用的开销)(3)在R... 查看详情

谈谈oc中的内联函数

内联函数即在编译的时候将函数体替换函数调用。从而不须要将parameter,returnaddress进行push/popstack的操作,从而加速app的执行。然而,会添加二进制文件的大小。疑问:内联函数和非内联函数有非常大不同吗?解答:对硬件硬性... 查看详情

内联函数知识点

内联函数知识点 1内联函数是C++为提高程序运行速度所作的一项改进  编译器将使用相应的函数代码替换函数调用,嵌入在代码中。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此内联函数的运... 查看详情

kotlin函数⑦(内联函数|lambda表达式弊端|“内联“机制避免内存开销-将使用lambda表达式作为参数的函数定义为内联函数|内联函数本质-宏替换)(代码片段)

文章目录一、内联函数1、Lambda表达式弊端2、"内联"机制避免内存开销3、内联函数本质-编译时宏替换4、内联函数不能递归二、普通函数代码示例三、内联函数代码示例一、内联函数1、Lambda表达式弊端Lambda表达式弊端:Lambda... 查看详情

7类-内联函数

内联函数一、内联函数作用避免函数调用的开销,将函数指定为内连函数,就是将它在每个调用点上“内联地”展开二、内联函数的声明定义在类内部的成员函数是自动inline的。我们无须在声明和定义的地方同时说明inline,但是... 查看详情

内联函数和函数重载(代码片段)

内联函数,是为了解决程序中函数调用的效率问题。函数重载允许程序员定义函数时使用相同的函数名,以不同数据类型的数据作为形参,实现相似功能的函数。内联函数在调用函数时,系统要将程序当前的一些状态信息、断点信息... 查看详情

内联函数

C++内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一... 查看详情

如何强制 gcc 内联函数?

】如何强制gcc内联函数?【英文标题】:HowdoIforcegcctoinlineafunction?【发布时间】:2012-01-1222:56:42【问题描述】:__attribute__((always_inline))是否强制一个函数被gcc内联?【问题讨论】:GCC使用代码大小作为启发式来确定是否内联。我... 查看详情

go语言中的内联函数

原文链接:面试官:小松子知道什么是内联函数吗?前言哈喽,大家好,我是asong。今天与大家来聊一聊内联函数。虽然我们在开发中根本不需要考虑内联函数,其在编译器编译代码时会做优化,但是如果想分析更底层的技术,... 查看详情

何时可以/将在 C++ 中内联函数?可以强制内联行为吗?

】何时可以/将在C++中内联函数?可以强制内联行为吗?【英文标题】:Whencan/willafunctionbeinlinedinC++?Caninlinebehaviorbeforced?【发布时间】:2015-06-1322:23:39【问题描述】:当我使用关键字inline时,我试图获得预期的行为。我尝试在不同... 查看详情

内联函数和宏

内联函数是为了提高程序运行速度的一种改进。当程序运行时,有时候需要重复调用一个函数,但是因为重复调用这个函数,会不断的造成函数调用,会不断进栈出栈造成cpu的消耗。而内联函数是在编译时就将这个函数边入进去... 查看详情

内联函数

...nbsp;      或许我们在C语言中听说过内联函数,但是内联函数是首先在C++中提出来的,可能现代的C编译器支持内联函数。        C++中的const常量可以代替宏常数定义,如:constintA... 查看详情

c++基础语法梳理:inline内联函数!虚函数可以是内联函数吗?(代码片段)

...0c;static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数特征相当于把内联函数里面的内容写在调用内联函数处;相当于不用执行进入函数的步骤,直接执行函数体;相当于宏,却... 查看详情

内联函数与#define的区别

  内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般... 查看详情

Callgrind 内联函数

】Callgrind内联函数【英文标题】:Callgrindinlinedfunctions【发布时间】:2012-10-2312:20:34【问题描述】:我正在分析我的代码,我已经找到了其中最昂贵的部分。然而,它发生在一个内联函数中。为了衡量影响,我强制该函数不被内... 查看详情

内联函数和宏定义

内联函数的优点?内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用。inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去,减少了普通函数调用时的消耗。什么时候使用inline... 查看详情