【C++】内联函数 ③ ( C++ 编译器 不一定允许内联函数的内联请求 | 内联函数的优缺点 | 内联函数 与 宏代码片段对比 )

2023-09-02 23:51:07





一、内联函数不一定成功




1、内联函数的优缺点


" 内联函数 " 不是在运行时调用的 ,

" 内联函数 " 是 编译时 将 函数体 对应的 CPU 指令 直接嵌入到调用该函数的地方 ,

从而 降低了 函数调用的开销 , 提高了程序的执行效率 ;


内联函数 的 缺点 也很明显 , 就是会增加代码的大小 , 调用了多少次内联函数 , 就要拷贝多少次内联函数的代码指令到调用的地方 ;

要谨慎使用 " 内联函数 " , 避免不必要的 开销 和 代码膨胀 ;


2、C++ 编译器 不一定允许内联函数的内联请求


由于 " 内联函数 " 会导致不必要的 开销 和 代码膨胀 , 因此 , C++ 编译器并不一定保证内联请求的成功 ;

使用 inline 关键字 可以请求 C++ 编译器将函数进行内联 , 但是编译器并不一定会接受这个请求 ;


权衡利弊 : " 内联函数 "是否 成功内联 取决于 C++ 编译器 的 实现 和 优化策略 ;

  • 内联函数 优点 是 可以减少函数调用的开销,提高程序的执行效率 ;
  • 内联函数 缺点 是 会增加代码的大小 , 会降低程序的性能 ;

因此,编译器在决定 " 内联函数 " 是否 内联时 , 会进行权衡 内联带来的性能提升 和 代码大小增加的开销 ;


3、是否内联决定权在编译器手中


是否内联决定权在编译器手中 : 在 C++ 语言中,inline关键字只是对编译器的建议,编译器可以根据自己的 优化策略 自由决定是否内联函数 ;

在 普通函数 声明和定义 位置 前面加上 inline 关键字 ,

  • 只是 建议 C++ 编译器将该函数内联 , 并不强制要求编译器内联函数 ,
  • 如果编译器决定不内联函数 , 该 内联函数 作用 等同于 普通函数 ;

最终 内联函数 是否内联成功 , 由 编译器 决定 ;





二、内联函数 与 宏代码片段对比




1、内联函数


" 内联函数 " 的 本质是 函数 , 其是一种 特殊的函数 ;


" 内联函数 " 有 普通函数 的特征 , 即 :

  • 定义时 有 函数名 , 参数列表 , 返回值类型 , 函数体 ;
  • 执行时 有 参数检查 , 返回值类型检查 ;

内联函数 的 inline 关键字 只是请求 C++ 编译器 将 该函数进行内联 , 具体 C++ 是否同意 , 需要根据 C++ 编译器的优化策略决定 , 可能同意 , 也可能不同意 ;

如果 C++ 编译器 不同意 内联请求 , 则该 内联函数 就是 普通函数 , 当做 普通函数 进行调用处理 ;


2、宏代码片段


" 宏代码片段 " 本质 是 宏定义 ;

宏代码片段 是由 预处理器 进行处理 , 执行的操作是 简单的文本替换 ;

宏代码片段 不是函数 , 没有函数那么强大的功能 , 执行时不会进行 参数和返回值 的类型检查 , 没有编译的过程 ;

更多推荐

【LLM】Prompt tuning大模型微调实战

noteprompttuning可看做是prefixtuning的简化版本,在输入层加入prompttokens,并不需要加入MLP进行调整来解决难训练的问题,作者实验表明随着预训练模型参数量的增加,prompttuning效果逼近finetuning效果文章目录note一、Propmttuning1.peft库中的t

热点探测技术架构设计与实践

1.概述说到热点问题,首先我们先理解一下什么是热点?热点通常意义来说,是指在一段时间内,被广泛关注的物品或事件,例如微博热搜,热卖商品,热点新闻,明星直播等等,所以热点产生主要包含2个条件:1.有限时间,2流量高聚。而在互联网领域,热点又主要分为2大类:1.有预期的热点:比如在电商活动当中推出的爆款联名限量款的商品,又

软件机器人财务报表信息的采集和录入、抵押贷款信息查询助力银行贷款业务管理

随着科技的飞速发展,自动化的应用场景也越来越广泛。博为小帮软件机器人的出现,无疑为众多行业带来了巨大的转变,其中就包括银行贷款业务。软件机器人是一种可以模拟人类行为,自动化执行高重复性任务。银行业务中,许多重复性高、规则明确的工作,如企业客户财务报表信息的采集和录入、抵质押贷款的抵质押物信息查询等,正适合软件机器人的应

安卓备份分区----手动查询安卓系统分区信息 导出系统分区的一些基本操作

在玩机搞机过程中。有时候需要手动查看有些分区信息,或者备份分区的操作。那么今天以小米8为例解析下其中的操作步骤机型:小米8adb版本:https://developer.android.com/studio/releases/platform-tools机型芯片:高通骁龙845手机系统版本:安卓10机型界面:twrp机

嵌入式Linux驱动开发(I2C专题)(四)

编写APP直接访问EEPROM参考资料:Linux驱动程序:drivers/i2c/i2c-dev.cI2C-Tools-4.2:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AT24cxx.pdf1.硬件连接STM32MP157的I2C模块连

嵌入式学习 - 用电控制电

目录前言:1、继电器2、二极管3、三极管3.1特殊的三极管-mos管3.2npn类型三极管3.3pnp类型三极管3.4三极管的放大特性3.5mos管和三极管的区别前言:计算机的工作的核心原理:用电去控制电。所有的电子元件都有数据手册,不同型号的电子元件需要翻阅对应的数据手册。1、继电器电路图和原理如下:如图所示,当继电

CentOS7安装MySQL

文章目录前言一、MySQL5.71.1安装wget1.2下载&安装MySQL的rpm源1.3修改MySQL安装版本1.4下载并启动MySQL1.5开启MySQL远程连接用户二、MySQL8.0注意事项前言CentOS7的安装,采用的是yum的方式安装。yum方式安装,就类似在Windows下不停的下一步,下一步。根据官

灰度变换原理//test later

灰度变换原理图像灰度变换变换原理:通过变换函数T将原图像像素灰度值r映射为灰度值s:2、灰度反转2.1原理灰度反转:将图像亮暗对调,可以增强图像中暗色区域细节�=�(�)=�−1−�其中L为图像灰度级,0~255灰度图像的灰度级为256.2.2c++opencv代码#include<iostream>#include<

如何快速检测代理IP质量?

一直以来,IP代理都是出海跨境业务的刚需。质量好的IP代理,除了在跨境业务产生巨大作用,在SEO监控、爬虫抓取、市场研究等领域也发挥着很大的作用。但是,对于IP代理的质量检测是我们选择高标准IP代理的一句,我们一般都会建议在使用IP代理前,进行测试或检测。那么我们应该如何快速地检测代理IP的有效性与质量的好坏呢?接下来

第三章 关系数据库标准语言SQL

第三章关系数据库标准语言SQL3.1SQL概述3.1.1SQL的产生与发展3.1.2SQL的特点主要特点:综合统一集数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)的功能于一体}数据操作统一可以独立完成数据库生命周期中的全部活动,包括以下一系列操作要求:定义和修改、删除关系模式,定义和删除视图,插

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

热文推荐