【C++】内联函数 ⑤ ( 内联函数总结 | 内联函数代码示例 )

news2025/1/16 2:47:06

文章目录

  • 一、内联函数总结
  • 二、内联函数代码示例
    • 1、代码示例 - 普通函数执行分析
    • 2、代码示例 - 内联函数执行分析
    • 3、代码示例 - 宏代码片段执行分析





一、内联函数总结



回顾下 之前的博客中 介绍的 内联函数 :

  • 内联函数编译 : C++ 编译器 编译 内联函数 时 , 会直接 将 内联函数 函数体 指令插入到 调用 内联函数 的位置 ;
  • 内联请求会被拒绝 : 使用 inline 关键字 修饰 普通函数 , 将其转化为 内联函数 , 编译器不一定同意该 内联请求 , 如果 有循环语句 / 有很多条件判定语句 / 函数体庞大 / 对函数取地址操作 / 单独声明内联函数 , 即使写了 inline 内联函数 , 编译器也不会同意内联请求 ;
  • 内联函数优势 : 内联函数 与 普通函数 对比 , 其优势只是 省去了 函数调用时 的 压栈 / 跳转 / 返回 的开销 ;




二、内联函数代码示例




1、代码示例 - 普通函数执行分析


调用 int c = fun1(++a, b); 代码 , fun1 是 普通函数 ;

执行时 ,

首先 , 执行 a 的自增 , 之后变量 a = 2 ;

然后 , 执行 fun1 普通函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 普通函数 ;

最后 , 普通函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;

因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;


代码示例 - 内联函数执行分析 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数 
// 编译器 编译时 会拒绝该内联函数的 内联请求 
// 将其作为普通函数处理
//inline int fun(int a, int b);

// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))

// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
    return a < b ? a : b;
}

// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
    return a < b ? a : b;
}

int main() {

    
    int a = 1;
    int b = 3;

    // 调用普通函数
    // 此时先执行 a 的自增 a = 2
    // 然后再执行函数 , 将 a = 2 , b = 3 传入
    // 结果得到 a b 中较小的值 c = a = 2
    int c = fun1(++a, b);

    // 打印内联函数调用结果
    printf("a = %d, b = %d, c = %d\n", a, b, c);

    // 控制台暂停
    system("pause");

    return 0;
}

执行结果 :

a = 2, b = 3, c = 2
请按任意键继续. . .

在这里插入图片描述


2、代码示例 - 内联函数执行分析


调用 int c = fun(++a, b); 代码 , fun 是 内联函数 ;

执行时 ,

首先 , 执行 a 的自增 , 之后变量 a = 2 ;

然后 , 执行 fun 内联函数 , 传入两个参数 , 将 a = 2 , b = 3 当做实参 传入 内联函数 ;

最后 , 内联函数 返回 a = 2 , b = 3 中 较小的值 , 赋值给 c = a = 2 ;

因此 , 最终得到的结果是 : a = 2 , b = 3 , c = 2;


内联函数 的 执行结果 , 与 普通函数 的执行结果是一样的 ;


代码示例 - 内联函数执行分析 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数 
// 编译器 编译时 会拒绝该内联函数的 内联请求 
// 将其作为普通函数处理
//inline int fun(int a, int b);

// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))

// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
    return a < b ? a : b;
}

// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
    return a < b ? a : b;
}

int main() {

    
    int a = 1;
    int b = 3;

    // 调用内联函数
    // 此时先执行 a 的自增 a = 2
    // 然后再执行函数 , 将 a = 2 , b = 3 传入
    // 结果得到 a b 中较小的值 c = a = 2
    int c = fun(++a, b);

    // 打印内联函数调用结果
    printf("a = %d, b = %d, c = %d\n", a, b, c);

    // 控制台暂停
    system("pause");

    return 0;
}

执行结果 :

a = 2, b = 3, c = 2
请按任意键继续. . .

在这里插入图片描述


3、代码示例 - 宏代码片段执行分析


执行 int c = FUN(++a, b); 代码 , 调用宏代码片段 ;

宏代码片段在 预编译阶段 机械的将宏展开 , 宏替换很机械 ;

宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置 ,

((++a) < (b) ? (++a) : (b))

执行过程如下 :

  • 首先 , 执行 ++a 变为 2 ;
  • 然后 , 比较 2 < 3 , 返回结果是 (++a) 此时又要自增一次 a 变为 3 ;
  • 最后 , a = 3 返回 , 最小值为 3 ;

代码示例 - 宏代码片段执行分析 :

// 导入标准 io 流头文件 其中定义了 std 命名空间
#include <iostream>
// 导入 std 命名空间
using namespace std;

// 声明内联函数 不会报错 程序能正常运行
// 但是不建议这样做
// 一旦像这样声明 内联函数 
// 编译器 编译时 会拒绝该内联函数的 内联请求 
// 将其作为普通函数处理
//inline int fun(int a, int b);

// 宏代码片段 : 获取 a 和 b 中较小的值
#define FUN(a, b) ((a) < (b) ? (a) : (b))

// 内联函数 : 获取 a 和 b 中较小的值
inline int fun(int a, int b)
{
    return a < b ? a : b;
}

// 普通函数 : 获取 a 和 b 中较小的值
inline int fun1(int a, int b)
{
    return a < b ? a : b;
}

int main() {

    
    int a = 1;
    int b = 3;

    // 调用宏代码片段
    // 机械的将宏展开 , 宏替换很机械 
    // 宏替换结果如下 : 将 ++a 替换到 FUN(a , b) 中 a 的位置
    // ((++a) < (b) ? (++a) : (b))
    // 首先 , 执行 ++a 变为 2 , 
    // 然后 , 比较  2 < 3 , 返回结果是 (++a) 此时又要自增一次 a 变为 3
    // 最后 , a = 3 返回 , 最小值为 3
    int c = FUN(++a, b);

    // 打印内联函数调用结果
    printf("a = %d, b = %d, c = %d\n", a, b, c);

    // 控制台暂停
    system("pause");

    return 0;
}

执行结果 :

a = 3, b = 3, c = 3
请按任意键继续. . .

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端开发纷繁复杂,是否有更高效的开发方式?

一、前言 此前&#xff0c;我曾跟大家聊到&#xff0c;低代码编程&#xff0c;在现阶段互联网业务疯狂增长的带动之下&#xff0c;被赋予了全新的使命和义务&#xff0c;即帮助开发者在前期以较低成本的方式&#xff0c;快速构建一个可投入市场的应用。 那么&#xff0c;有没有…

腾讯云轻量2核4G5M服务器_CPU内存_流量_带宽_系统盘

腾讯云轻量2核4G5M服务器&#xff1a;CPU内存流量带宽系统盘性能测评&#xff1a;轻量应用服务器2核4G5M带宽&#xff0c;免费500GB月流量&#xff0c;60GB系统盘SSD盘&#xff0c;5M带宽下载速度可达640KB/秒&#xff0c;流量超额按照0.8元每GB支付流量费&#xff0c;轻量2核4…

都2023年了,别再用ifconfig啦! 试试这个吧!

下午好&#xff0c;我的网工朋友。 ifconfig这玩意儿&#xff0c;还有多少人在用&#xff1f;举个手看看 总在说ifconfig即将被淘汰&#xff0c;但其实很多网工还在用吧。 比如说组合使用诸如ifconfig、route、arp和netstat等命令行工具&#xff08;来源于安装包net-tools&a…

调查称全球多所顶尖高校网站存在网络攻击风险

Cyber News的一项调查研究显示&#xff0c;全球多所顶尖高校的网站未能及时更新安全补丁&#xff0c;存在敏感信息泄露&#xff0c;甚至被攻击者全面接管的风险。 Cyber​​ News 研究团队详细调查了 20 个每月有数百万访问量的高校网站&#xff0c;其中至少有6个是位于全球Top…

Mac清理垃圾软软件CleanMyMac X的软件功能介绍

在我们使用我们的Mac一定的时间后&#xff0c;总是不可避免的出现Mac内存不足的情况&#xff0c;所以清理垃圾软件也就成为了我们电脑里必不可少的软件。苹果软件商店中有很多各有不同的清理垃圾软件&#xff0c;但我们往往很难从这一大堆软件中找到令自己心满意足的。 但是这…

目录操作函数

mkdir函数 rmdir函数 删除空目录 rename函数 换名 chdir函数 修改当前的工作目录 getcwd函数 获取当前工作的路径

X2-VLM: All-In-One Pre-trained Model For Vision-Language Tasks论文笔记

Title&#xff1a;X2-VLM: All-In-One Pre-trained Model For Vision-Language Tasks Code 1. Motivation CLIP这一类方法只能进行图片级别的视觉和文本对齐&#xff1b;也有一些方法利用预训练的目标检测器进行目标级别的视觉和文本对齐&#xff0c;但是只能编码目标内部的特…

WMS仓储-亿发数字化工厂库存管理系统,提升中小企业仓储管理效率

中小企业竞争日益激烈的市场中&#xff0c;仓库管理的重要性不可低估。为了适应不断变化的业务规模和模式&#xff0c;中小企业对仓库管理提出了更高水平的智能化要求。数字化工厂库存管理系统&#xff0c;正是应运而生&#xff0c;助力企业加强仓库智能作业效率&#xff0c;并…

CRM销售管理系统如何提高销售效率

CRM销售管理系统是帮助企业对销售活动进行管理、执行和优化的软件系统。它可以帮助企业提高销售效率&#xff0c;提高客户转化率&#xff0c;实现企业的业绩增长。那么&#xff0c;CRM销售管理系统好用吗&#xff1f; CRM销售管理系统的功能 线索管理&#xff1a; CRM系统可…

​金蝶云星空管理中心反序列化RCE漏洞复现 附POC

文章目录 ​金蝶云星空管理中心反序列化RCE漏洞复现0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现4.进行ipconfig命令测试 0x06修复建议 ​金蝶云星空管理中心反序列化RCE漏洞复现 0x01 前言 免责声明&#xff1a;请勿利用文…

iframe 实现跨域,两页面之间的通信

一、 背景 一个项目为vue2&#xff0c;一个项目为vue3&#xff0c;两个不同的项目实现iframe嵌入&#xff0c;并实现通信 二、方案 iframe跨域时&#xff0c;iframe组件之间常用的通信&#xff0c;主要是H5的possmessage方法 三、案例代码 父页面-vue2&#xff08;端口号为…

日常开发小汇总(5)元素跟随鼠标移动(在视口下移动)

<div class"mark"><h1>title</h1><div><p>title 鼠标移动 盒子整体移动</p><p>test</p><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Modi, porro.</p></div></div>cons…

微信商城小程序开发

微信小程序商城制作流程详解 微信小程序商城的出现为商家提供了一个全新的线上销售平台&#xff0c;让商家能够在微信生态系统中直接向用户展示和销售自己的产品。本文将详细介绍微信小程序商城的制作流程&#xff0c;帮助商家和开发者更好地理解和掌握这一新兴技术。 一、注…

python+chdb 向量检索,百万数据秒级查询

随机生成向量数据集 import numpy as np import pandas as pddata_vectors [(i, np.random.random(300)) for i in range(1000000)] df pd.DataFrame(data_vectors) df.columns [idx, vector] df转化成parquet格式&#xff0c;分批转化&#xff0c;一次会爆炸 import pyar…

yolov5添加ECA注意力机制

ECA注意力机制简介 论文题目&#xff1a;ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 论文地址&#xff1a;here 基本原理 &#x1f438; ECANet的核心思想是提出了一种不降维的局部跨通道交互策略&#xff0c;有效避免了降维对于通道注意…

HbuilderX uniapp项目转cli项目全过程记录

1、按照官网步骤准备环境 (1) 全局安装 vue-cli npm install -g vue/cli (2) 创建uni-app 使用正式版&#xff08;对应HBuilderX最新正式版 vue create -p dcloudio/uni-preset-vue my-project 使用alpha版&#xff08;对应HBuilderX最新alpha版 vue create -p dcloudio/un…

jar包依赖冲突排查思路和解决方法,以及类加载机制排查(系统原因也导致预发布环境和本地环境的差异)

冲突提示信息 「java.lang.ClassNotFoundException」&#xff1a;类型转换错误&#xff0c;本应该引入的是 logback 包的类&#xff0c;但是实际引入的是 slf4j 下的同名类&#xff0c;导致类型转换错误。 「java.lang.NoSuchMethodError」&#xff1a;找不到特定方法&#x…

【css】linear-gradient()的用法

linear-gradient() CSS函数创建一个由两种或多种颜色沿一条直线进行线性过渡的图像,其结果是<gradient>数据类型的对象,此对象是一种特殊的<image> 数据类型。 语法 /* 渐变轴为 45 度&#xff0c;从蓝色渐变到红色 */ linear-gradient(45deg, blue, red);/* 从右…

Transformer-2. 注意力分数

上一节记录了注意力机制的基础&#xff0c;这一节主要做几个实现&#xff0c;沐神说qkv在不同任务中的角色不一&#xff0c;所以后续内容才会搞懂qkv是啥玩意。 上节使用了高斯核来对查询和键之间的关系建模。 高斯核指数部分可以视为注意力评分函数&#xff08;attention sco…

C高级shell脚本

#!/bin/bash function fun() {sum0i0b($*)while [ $i -lt ${#b[*]} ]do((sum ${b[i]}))((i))doneecho $sum }read -p "请输入数组" -a a fun ${a[*]}function fun2() {aid -ubid -gecho $a $b } p(fun2) uid${p[0]} pid${p[1]} echo $uid $pidXMind