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

news/2024/5/20 4:57:05 标签: c++, C, 内联函数, 宏代码片段, inline

文章目录





一、内联函数不一定成功




1、内联函数的优缺点


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

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

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


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

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


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


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

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


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

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

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


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


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

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

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





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




1、内联函数


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


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

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

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

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


2、宏代码片段


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

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

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


http://www.niftyadmin.cn/n/5013384.html

相关文章

Navicat Premium 16 安装及卸载

Navicat Premium 16 安装及卸载 文章目录 Navicat Premium 16 安装及卸载一 、简介二、下载三、安装四、使用五、卸载 一 、简介 Navicat Premium 是一套可创建多个连接的数据库开发工具,让你从单一应用程序中同时连接 MySQL、Redis、MariaDB、MongoDB、SQL Server、…

[Linux]动静态库

[Linux]动静态库 文章目录 [Linux]动静态库见一见库存在库的原因编写库模拟编写静态库模拟使用静态库模拟编写动态库模拟使用静态库 库的加载原理静态库的加载原理动态库的加载原理 库在可执行程序中的编址策略静态库在可执行程序中的编址策略动态库在可执行程序中的编址策略 见…

【前端】在Vue页面中引入其它vue页面 数据传输 相互调用方法等

主页面 home 从页面 headView 需求 在 home.vue 中引用 headView.Vue 方案: home.vue 代码: 只需要在home.vue 想要的地方添加 <headView></headView> <script>//聊天页面 import headView /view/headView.vueexport default {components: {headView},…

算法:数组常见套路1---双指针、取模、打擂台法

一、数组的合并–双指针[快慢指针] 1、题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺…

用户促活留存新方式——在APP中嵌入小游戏

随着APP同类产品的不断出现&#xff0c;APP开发者们面临着激烈的竞争&#xff0c;很多APP下载后被新的APP取代&#xff0c;获客成本越来越高。同时开发者还会面临用户粘性差、忠诚度低、用完即走、留存困难&#xff0c;商业化价值被大大缩减。 在APP中植入小游戏来提高用户活跃…

Python数据采集:抓取和解析XML数据

在当今信息爆炸的时代&#xff0c;获取并分析大量结构化数据对于企业和个人来说至关重要。本文将详细介绍如何使用Python进行XML数据的抓取与解析&#xff0c;并提供操作示例帮助您快速有效地从各种来源中提取有价值的信息。   一、理解XML格式及其优势   XML&#xff08;可…

Linux之Shell变量和引用

目录 深入认识变量 什么是变量 变量的名称 组成 规则 变量的类型 原则 shell的变量数据类型 变量定义 原则 格式 案例 自定义变量 定义 引用变量的值 查看变量 环境变量 定义 定义环境变量 案例 --- 三种方法定义 对比 shell环境变量存储的文件 位置变量…

Discourse 的系统日志

Discourse 提供了较为完善的日志查看方式。 用得最多的可能就是 Logster 的基于 Web 的 UI 了。 Logster Discourse 的错误日志面板用的是 logster&#xff0c;采集的是 Rails/Rack 的日志&#xff0c;正常应该用 Rails::Logger 但是 discourse 做了封装。 正常的访问地址为…