内联函数分析

目录

  • 1. 内联函数的声明
  • 2. 内联函数的特性
  • 3. 内联函数与编译器
  • 4. 内联函数的限制

1. 内联函数的声明

  • 在C++中,const常量可以代替宏常数定义,而宏代码段则推荐使用内联函数来代替。
  • C++中使用inline关键字声明内联函数
  • inline只是一种请求,编译器不一定允许这种请求
  • inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求
inline int func(int a, int b)
{
    return a < b ? a : b;
}

2. 内联函数的特性

  • C++编译器直接将内联函数的函数体扩展到函数调用的地方
  • 内联函数调用时没有压栈、跳转、返回等额外开销
  • 内联函数具有参数检查、返回类型等普通函数特征
  • 内联函数与宏代码段相比,保留了比普通函数效率更高、开销更小的优点,摒弃了宏代码段不经过编译器可能带来副作用的缺点
#include <stdio.h>

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

inline int max(int a, int b)
{
    return a < b ? a : b;
}

int main(int argc, char *argv[])
{
    int a1 = 1;
    int b1 = 3;
    int c1 = MAX(++a1, b1);

    int a2 = 1;
    int b2 = 3;
    int c2 = max(++a2, b2);

    printf("a1 = %d\n", a1);
    printf("b1 = %d\n", b1);
    printf("c1 = %d\n", c1);

    printf("\n");

    printf("a2 = %d\n", a2);
    printf("b2 = %d\n", b2);
    printf("c2 = %d\n", c2);

    return 0;
}

3. 内联函数与编译器

  • 现代C++编译器能够进行编译优化,函数即使没有inline声明,也可能被内联编译;声明了inline,编译器也未必会同意
  • 一些现代C++编译器还提供了扩展语法,允许强制内联,如g++的__attribute__((always_inline))
__attribute__((always_inline)) int func(int a, int b)
{
    return a < b ? a : b;
}

4. 内联函数的限制

C++语言对内联函数具有以下限制:

  • 不能存在任何形式的循环语句
  • 不能存在过多的条件判断语句
  • 函数体不能过于庞大
  • 不能对函数进行取址操作
  • 函数内联声明必须在调用语句之前

注意:这些只是C++语言本身对内联函数的限制,现代C++编译器可以突破这些限制,实际上,只要函数不是过于夸张,内联一般都是可以成功的。

原文地址:https://www.cnblogs.com/songhe364826110/p/11518886.html

时间: 2024-09-30 20:48:33

内联函数分析的相关文章

第6课 内联函数分析

1.  常量与宏回顾 (1)C++中的const常量可以替代宏常数定义,如: const int A = 3; ←→ #define A  3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 2. 内联函数 2.1 内联函数的定义 (1)C++编译器可以将一个函数进行内联编译,被C++编译器内联编译的函数叫内联函数. (2)C++中使用inline关键字声明内联函数.如 inline int func(int a, int b) { return a < b ? a : b; } (3

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

C++引用,内联函数,函数重载二义性总结_C++

1.引用 1.1 引用的概念 C++语言中,可以定义"引用".引用定义如下: 类型名 & 引用名 = 同类型的某变量名: 例如:int n: int &r=n://r就是一个引用,可以说r的类型是int &,r引用了变量n,或者说r成为n的引用. 某个变量的引用和这个变量是一回事,相当于该变量的一个别名.请注意,定义引用时一定要将其初始化,否则编译不会通过,通常会用某个变量去初始化引用,初始化后,它就一直引用该变量,不会再引用别的变量了.也可以用一个引用去初始化

C++学习笔记之——内联函数,引用

本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/ 作者:晨凫追风 一直想开始写C++的学习笔记,学习C++已经两个月了,今天开始写一下引用,内联函数,的一些概念和作用吧.那么开始吧! ????内联函数: 我们写的程序最终都是要用编译器,进行编译链接形成一段机器可以知道的二进制代码,接着存到一个内存中,这时候每一段程序代码都会有自己的一个地址,计算机按照地址增

C++ 内联函数

1.定义: 被调用函数的函数体代码直接插入到该函数被调用处, 而不是通过call语句进行. 2.方式: (1).类的定义体外: 当在类的定义体外时,需要在该成员函数的定义前面加“inline”关键字,显式地告诉编译器该函数在调用时需要“内联”处理,如: class Person { public: string GetName(); private:   string  name; }; inline string GetName() {         return name; } (2).类

C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针

 目  录 1       开始学习C++.............................................................................................................. 4 1.1       C++的头文件.................................................................................................

Java 内联函数

在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到  转去执行该函数前的地方.这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保  存地址继续执行.也就是通常说的压栈和出栈.因此,函数调用要有一定的时间和空间方面的开销.那么对于那些函数体  代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大. 那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了.内联函数

内联函数(五)

或许我们在 C 语言中听说过内联函数,但是内联函数是首先在 C++ 中提出来的,可能现代的 C 编译器支持内联函数. C++ 中的 const 常量可以代替宏常数定义,如:const int A = 3: <==> #define A 3:那么在 C++ 中是否有解决方案代替宏代码片段呢?在 C++ 中推荐使用内联函数替代宏代码片段,使用 inline 关键字声明内联函数.内联函数声明时 inline 关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求. C++ 编译器可以将一个函数

C++ 内联函数 摘自 C++ 应用程序性能优化

内联函数 在C++语言的设计中,内联函数的引入可以说完全是为了性能的考虑.因此在编写对性能要求比较高的C++程序时,非常有必要仔细考量内联函数的使用. 所谓"内联",即将被调用函数的函数体代码直接地整个插入到该函数被调用处,而不是通过call语句进行.当然,编译器在真正进行"内联"时,因为考虑到被内联函数的传入参数.自己的局部变量,以及返回值的因素,不仅仅只是进行简单的代码拷贝,还需要做很多细致的工作,但大致思路如此. 开发人员可以有两种方式告诉编译器需要内联哪些类