C++ inline内联函数

内联函数

函数调用是有时间和空间开销的。程序在执行一个函数之前需要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;执行完之后,还要将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。

如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两句语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就不容忽视。

为了消除函数调用的时空开销,C++在编译时将函数调用处用函数体替换,即内联函数。

注意:要在函数定义出添加inline关键字,在函数声明处添加inline关键字是无效的。

#include <iostream>
using namespace std;
//内联函数,交换两个数的值
inline void swap(int *a, int *b){
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
int main(){
    int m, n;
    cin>>m>>n;
    cout<<m<<", "<<n<<endl;
    //编译器遇到函数调用swap(&m, &n)时,会用swap()函数体中的代码替换swap(&m,&n),同时用实参代替形参。
    swap(&m, &n);
    cout<<m<<", "<<n<<endl;
    return 0;
}

内联函数的缺点:编译后的程序会存在多份相同的函数拷贝。

注意:对函数做inline声明只是程序员对编译器的一个建议,而不是强制性的。编译器有自己的判断能力,它会根据具体情况做决定。

使用内联函数替换带参数的宏

和宏一样,内联函数可以定义在头文件中(不用加static关键字),并且头文件被多次#include后也不会引发重复定义错误。
内联函数在编译时会将函数调用处用函数体替换,编译完成后函数就不存在了,所以在链接时不会引发重复定义错误。
这一点和宏很像,宏在预处理时被展开,编译时就不存在了。从这个角度讲,内联函数更像编译期间的宏。

内联函数的两个作用:一是消除函数调用时的开销,二是取代带参数的宏。

如何规范的使用内联函数

从代码重复利用的角度讲,内联函数已经不再是函数了。因为内联函数的代码在编译后就被消除了,不存在于虚拟地址空间中,没法重复使用。

在多文件编程时,建议将内联函数的定义直接放在头文件中,并且禁用内联函数的声明

原文地址:https://www.cnblogs.com/xiaobaizzz/p/12345454.html

时间: 2024-10-09 22:31:06

C++ inline内联函数的相关文章

Inline 内联函数

Inline函数,即内联函数,它是把函数内部的代码直接插入到调用者代码处的函数,也就是该函数不是通过子函数调用这种常见的方式来实现的,而是直接替换到函数调用处(这点上有点类似#define宏),由此带来的优势就是省去了调用/返回指令,通过避免调用带来的开销(包括函数调用带来的额外的执行周期和堆栈的使用)来提高代码的执行效率,而又同时保留了函数封装形式带来的可读性,很好用吧有木有,下面就让我们看看具体的使用形式: /****************函数声明部分*****************/

c++——inline内联函数

1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3; ? #define A 3 C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!) C++中推荐使用内联函数替代宏代码片段 C++中使用inline关键字声明内联函数 内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求. //宏替换和函数调用区别 #include "iostream" using namespace

(inline)内联函数在IOS开发中的使用

今天在阅读YYKit源码(https://github.com/ibireme/YYKit.git)时发现在YYKitMacro.h组件中大量使用的内联函数,例如此文件中的一个函数 static inline void dispatch_async_on_main_queue(void (^block)()) { if (pthread_main_np()) { block(); } else { dispatch_async(dispatch_get_main_queue(), block);

【转】inline内联函数

技术类笔试题50%都会问宏与inline的区别,自己去找找看? 1)宏替换发生在预编译 2)宏函数(如果可以这么叫的话)替换时不会检查参数,inline函数会检查 3)宏一定会发生替换,inline貌似不是强制的,编译器想不替换也没关系 4)宏替换时存在着一些不可避免的陷阱(参见C Traps and Pitfalls),例如传参时如果传了a++之类的可能会出错,inline就比较安全了. 宏有副作用,比如MAX(x++,y++) inline会不同, 慎用内联内联能提高函数的执行效率,为什么不

inline内联函数

body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;} th{border: 1px solid gray; padding: 4px; background-color: #DDD;} td{border: 1px solid gray; padding: 4px;} tr:nth-child(

内联函数 inline 漫谈

内联函数存在的结论是: 引入内联函数是为了解决函数调用效率的问题 由于函数之间的调用,会从一个内存地址调到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址.函数调用会有一定的时间开销,引入内联函数就是为了解决这一问题. 不用inline修饰的函数, 汇编时会出现 call 指令.调用call指令就是就需要: (1)将下一条指令的所在地址入栈 (2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序). 原因 因为调用函数实际上将程序执行顺序转移到函数所存放在内存

iOS OC内联函数 inline的详解

inline 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A.不会导致重名的错误. inline.内联函数. 作用:替代宏. (如果你在看框架时,看到inline不解,搜索到这篇文章,看到这里可以不用看下面的详述了) 在框架中出现inline时,如YYKit框架.我们稍加观察就会发现它出现在.h文件中. such as: static inline CGFlo

内联函数与虚函数

如果函数已经被声明为inline, 内联函数已经在编译期间它的调用点上就被展开; 而虚拟函数调用的决定则要等到运行时刻在执行程序内部的每个调用点上系统根据被调用对象的实际基类或派生类的类型来决定选择哪一个虚拟函数实例. 内联不是强制性的,你只是向编译器提出这个建议,允许它在可以内联的时候采取内联形式.而虚函数本身就是一个函数,只是在多态的情况下,它要到执行时才能确定调用的函数,所以这样的特性阻止了虚函数的内联.但,要注意,只是在多态的情况下(多态不用我解释吧).如果是静态的调用,编译器还是会采用

C++_inline内联函数

inline内联函数可以实现在调用函数的地方拷贝代码副本,从而避免了函数调用跳转等存在的时间上耗时稍长的问题. (inline 要写在函数 定义 与 声明 之前,如 inline double square(double);      inline double square(double x){return x*x;}) 内联函数的使用前提: 1.代码段比较小 2.且函数调用频繁的代码可以使用内联函数,内联函数安全性比宏函数更好. 不会出现语义上的问题,而宏函数会出现语义上的问题(尤其对于自增