首页 > 编程语言 >c++ inline内联函数

c++ inline内联函数

时间:2022-09-19 14:22:33浏览次数:63  
标签:语句 调用 函数 c++ 编译器 内联 inline 定义

  1. 引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。在使用内联函数时要留神:

    • 1.在内联函数内不允许使用循环语句和开关语句;
    • 2.内联函数的定义必须出现在内联函数第一次调用之前;
    • 3.类结构中所在的类说明内部定义的函数是内联函数。
     
  2. Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数。

    定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.

    优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.

    缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。

    结论: 一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!

    另一个实用的经验准则: 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).

    有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.

标签:语句,调用,函数,c++,编译器,内联,inline,定义
From: https://www.cnblogs.com/h694879357/p/16707541.html

相关文章

  • UEC++ 容器:TArray
    说明:容器是方便我们存储数据的载体,在虚幻中,为我们提供了三种容器。分别是TArray,TMap,TSet。首先虚幻提供的容器都是同质容器,只能用来存储相同类型的数据。三种容器具备不同......
  • C++编译
    为什么需要编译:编写好的代码最终翻译为机器可执行的二进制指令,编译的过程如下图所示:  编译预处理:在预编译过程中主要处理源代码中的预处理指令。引入头文件#include......
  • UEC++ 数据类型
    禁止在UE中使用C++的基本数据类型,这样会影响引擎的跨平台特性1、基本数据类型bool代表布尔值(永远不要假设布尔值的大小)。BOOL将不会进行编译。TCHAR代表字符型......
  • C++定义变量与生存周期
    作用域:作用域即一个变量可以被引用的范围,常见的作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。全局变量:具有全局作用域。全局变......
  • C/C++公交路线自动化选择系统
    C/C++公交路线自动化选择系统程序设计题1:公交路线自动化选择系统实现出题人:张勤面向专业:测控技术与仪器难度等级:31问题描述要求编写一个程序,实现公交路线的自动......
  • C++11 -- 匿名函数(lambda 表达式)
    0.一道题目引入关于sb力扣定义外部函数和变量报错这件事最初我定义了一个\(cmp\)函数用来对\(vector\)排序,和一个全局变量\(unordered\_map\)用来记录元素个数......
  • 03(C++二级)
    1.函数不可嵌套定义,但可以嵌套调用。2.静态数据成员必须在类外初始化,使用类名调用。 初始化格式:<数据类型><类名>::<静态数据成员名>=<值>3.C++不能重载的:     ......
  • 霍夫变换原理及实现(Opencv C++)
    已知一幅图像中的n个点,假设我们希望找到这些点中位于直线上的子集。一种可能的解决方法是,首先找到由每对点确定的所有直线,然后寻找靠近特定直线的那些点的所有子集。这种方......
  • C++中深拷贝和浅拷贝
    浅拷贝:简单的赋值拷贝操作深拷贝:在堆区重新申请空间,进行拷贝操作 浅拷贝和深拷贝的问题出现的条件:1、拷贝构造函数2、用new关键字在堆区申请空间 在拷贝构造函数......
  • C++ 我的世界皮肤雕像
    #include<iostream>#include<string>#include<windows.h>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intmain(intargc,char**argv){ bool......