• C++解析(5):内联函数分析


    0.目录

    1.常量与宏回顾

    2.内联函数

    3.内联函数深度探析

    4.注意事项

    5.小结

    1.常量与宏回顾

    C++中的const常量可以替代宏常数定义,如:
    const int A = 3; <——> #define A 3

    C++中是否有解决方案替代宏代码片段呢?
    在C语言中讲过,宏是C语言里面的一种程序的单元。这种程序的单元是非常特别的,它不是由编译器来处理,是由预处理器来处理。
    比如说以上这个例子,右边是一个宏定义,定义了一个宏常数,当我们在程序里面使用这个宏常数A的时候,其实等价于使用了3,编译器编译的时候,首先预处理器出场,将程序里面的所有大写字母A进行文本替换,替换为3。这种文本替换是不会进行任何的语法检查或者语义检查的,仅仅就是复制粘贴的过程。也就是说后续出场的编译器根本不知道宏这种东西的存在。
    当然,这是有副作用的,宏的副作用在于没有类型检查,所以说,在C++里面,就将const进行了升级,由const所定义的常量就成为了真正意义上的常量,所以在C++中如果我们要使用宏常数,我们就可以直接通过const定义的常量来替换宏常数。
    既然const经过升级可以用来替换宏常数了,那我们知道通过#define还可以定义宏代码块,那在C++中是不是有什么解决方案可以来替换宏代码块呢?当然是有的,就是内联函数的提出。

    2.内联函数

    • C++中推荐使用内联函数替代宏代码片段
    • C++中使用inline关键字声明内联函数


    内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

    • C++编译器可以将一个函数进行内联编译
    • 被C++编译器内联编译的函数叫做内联函数
    • C++编译器直接将函数体插入函数调用的地方
    • 内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)

    C++编译器不一定满足函数的内联请求!

    3.内联函数深度探析

    • 内联函数具有普通函数的特征(参数检查返回类型等)
    • 函数的内联请求可能被编译器拒绝
    • 函数被内联编译后,函数体直接扩展到调用的地方

    宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用。

    现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译
    一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如:

    • g++:__attribute__((always_inline))属性
    • MSVC:__forceinline

    (直接用__attribute__((always_inline))或者__forceinline代替原来的普通的inline关键字即可。)

    4.注意事项

    C++中inline内联编译的限制:

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

    5.小结

    • C++中可以通过inline声明内联函数
    • 编译器直接将内联函数体扩展到函数调用的地方
    • inline只是一种请求,编译器不一定允许这种请求
    • 内联函数省去了函数调用时压栈,跳转和返回的开销
  • 相关阅读:
    systabcontrol32
    winform 进程唯一,打开第二个激活第一个进程的窗体显示
    winform在 Xp下杀死进程
    安装包创建桌面快捷方式
    [最短路/线段树大法优化DIJ] 【模板】单源最短路径(标准版)
    [线段树模板题] 线段树2
    [线段树优化应用] 数星星Star
    [倍增思想/变种最短路] 跑路
    [DP/变种背包] SOFTWARE
    [前缀和/数论] 数列
  • 原文地址:https://www.cnblogs.com/PyLearn/p/10072639.html
Copyright © 2020-2023  润新知