C++ 利器:inline 与 nullptr
探秘 C++ 利器:inline 与 nullptr
引言
在 C++ 的浩瀚海洋中,有着许多实用且强大的特性,它们如同夜空中闪烁的繁星,照亮了开发者前行的道路。今天,我们要深入探索其中两颗耀眼的星星:inline 关键字和 nullptr 空指针常量。这两个特性看似简单,却蕴含着巨大的能量,能够帮助我们编写出更高效、更安全的代码。
一、inline 关键字:速度与效率的魔法
1.1 函数调用的开销
在 C++ 中,函数调用是一项常见的操作。当我们调用一个函数时,程序会进行一系列的操作,比如保存当前的执行上下文(如寄存器的值)、跳转到函数的入口地址、执行函数体中的代码,最后再返回到调用点并恢复执行上下文。这些操作会带来一定的时间和空间开销,尤其是对于一些短小的函数,这种开销可能会显得比较明显。
举个例子,我们有一个简单的函数用于计算两个整数的和:
收起
cpp
int add(int a, int b) {return a + b;
}
当我们多次调用这个函数时,每次调用都会产生上述的开销。
1.2 inline 的作用
inline 关键字就是为了解决这个问题而引入的。当我们在函数定义前加上 inline 关键字时,就相当于告诉编译器:“嘿,这个函数比较小,你可以尝试把它的代码直接嵌入到调用它的地方,而不是进行常规的函数调用。”
我们将上面的 add 函数改成内联函数:
收起
cpp
inline int add(int a, int b) {return a + b;
}
当编译器遇到 add 函数的调用时,比如 int result = add(3, 4);,它可能会直接将 add 函数的代码展开,就像这样:
收起
cpp
int result = 3 + 4;
这样就避免了函数调用的开销,提高了程序的执行速度。
1.3 使用 inline 的注意事项
- 只是建议:需要注意的是,
inline只是给编译器的一个建议,而不是强制要求。编译器会根据函数的复杂度、代码大小等因素来决定是否真正将函数内联展开。如果函数体比较复杂,编译器可能会忽略inline关键字。 - 定义和声明:内联函数的定义通常要放在头文件中。因为编译器需要在调用点看到函数的完整定义才能进行内联展开。如果只在头文件中声明了内联函数,而在源文件中定义,可能会导致内联失败。
- 代码膨胀:过度使用内联函数可能会导致代码膨胀。因为每次调用内联函数时,都会将函数代码复制到调用点,这会增加代码的体积。所以,只有对于那些短小、频繁调用的函数,使用
inline才是比较合适的。
二、nullptr:空指针的新选择
2.1 传统空指针的问题
在 C++ 的早期版本中,我们通常使用 NULL 来表示空指针。NULL 实际上是一个宏,在不同的编译器中,它可能被定义为 0 或者 (void*)0。这种定义方式会带来一些问题,尤其是在函数重载的情况下。
看下面的代码示例:
收起
cpp
#include <iostream>void func(int num) {std::cout << "Called with int: " << num << std::endl;
}void func(char* ptr) {std::cout << "Called with char*: " << (ptr ? "non - null" : "null") << std::endl;
}int main() {func(NULL); // 这里会调用哪个函数呢?return 0;
}
由于 NULL 可能被定义为 0,编译器在处理 func(NULL) 时,会优先匹配参数为 int 的函数,而不是我们期望的 char* 函数。这就导致了代码的行为不符合我们的预期。
2.2 nullptr 的引入
为了解决上述问题,C++11 引入了 nullptr 关键字。nullptr 是一个空指针常量,它的类型是 std::nullptr_t,可以隐式转换为任何指针类型,但不会与整数类型混淆。
我们将上面的代码修改为使用 nullptr:
收起
cpp
#include <iostream>void func(int num) {std::cout << "Called with int: " << num << std::endl;
}void func(char* ptr) {std::cout << "Called with char*: " << (ptr ? "non - null" : "null") << std::endl;
}int main() {func(nullptr); // 这次会正确调用参数为 char* 的函数return 0;
}
当我们使用 nullptr 调用 func 函数时,编译器会正确地匹配参数为 char* 的函数,避免了传统空指针带来的问题。
2.3 使用 nullptr 的好处
- 类型安全:
nullptr具有明确的类型,能够避免与整数类型的混淆,提高了代码的类型安全性。 - 代码清晰:使用
nullptr可以让代码更加清晰易读,明确表达了这是一个空指针的意图。
三、总结
inline 关键字和 nullptr 都是 C++ 中非常实用的特性。inline 能够帮助我们提高程序的执行效率,尤其是对于短小频繁调用的函数;而 nullptr 则解决了传统空指针在类型安全方面的问题,让我们的代码更加健壮。在日常的 C++ 编程中,合理使用这两个特性,能够让我们编写出更加高效、安全、易读的代码。
希望通过这篇文章,你对 inline 和 nullptr 有了更深入的理解,快去在你的代码中试试它们的威力吧!
你在使用 inline 或者 nullptr 的过程中遇到过什么有趣的问题吗?欢迎在评论区留言分享你的经验和想法!
相关文章:
C++ 利器:inline 与 nullptr
探秘 C 利器:inline 与 nullptr 引言 在 C 的浩瀚海洋中,有着许多实用且强大的特性,它们如同夜空中闪烁的繁星,照亮了开发者前行的道路。今天,我们要深入探索其中两颗耀眼的星星:inline 关键字和 nullptr …...
给一个单体项目加装Feign
1.导入pom坐标 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.2</version> </dependency> 2.主函数注解 EnableFeignClients public cl…...
可以使用Deepseek R1模型的平台集锦
最近Deepseek掀起了AI浪潮,就在今天百度文心一言和ChatGPT宣布要在近期实施免费开放,日渐减少的用户。Deepseek这么火爆,其官网却一直遭受攻击,访问速度很慢。自己本地部署,又负担不起硬件费用,相比之下&am…...
“探索1688平台:高效获取店铺商品信息的实用指南“
在电商领域,获取店铺所有商品信息对于商家进行数据分析、库存管理、竞品分析等方面具有重要意义。1688平台作为中国领先的B2B电商平台,提供了丰富的API接口供开发者使用,其中就包括获取店铺所有商品信息的接口。本文将详细介绍如何使用该接口…...
在fedora41中安装钉钉dingtalk_7.6.25.4122001_amd64
在Fedora-Workstation-Live-x86_64-41-1.4中安装钉钉dingtalk_7.6.25.4122001_amd64.deb 到官网下载钉钉Linux客户端com.alibabainc.dingtalk_7.6.25.4122001_amd64.deb https://page.dingtalk.com/wow/z/dingtalk/simple/ddhomedownload#/ 一、直接使用dpkg命令安装deb包报错…...
数据结构:图论入门
图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...
有限状态系统的抽象定义及CEGAR分析解析理论篇
文章目录 一、有限状态系统的抽象定义及相关阐述1、有限状态系统定义2、 有限状态系统间的抽象关系(Abstract)2.1 基于函数的抽象定义2.2 基于等价关系的抽象定义 二、 基于上面的定义出发,提出的思考1. 为什么我们想要/需要进行抽象2. 抽象是…...
Apache Hive用PySpark统计指定表中各字段的空值、空字符串或零值比例
from pyspark.sql import SparkSession from pyspark.sql.functions import col, coalesce, trim, when, lit, sum from pyspark.sql.types import StringType, NumericType# 初始化SparkSession spark SparkSession.builder \.appName("Hive Data Quality Analysis"…...
高校元宇宙实训室解决方案:以技术驱动教育,用数字人链接未来
在AIGC技术的浪潮下,AI数字人正成为数字营销、文化传播等领域的核心工具。为助力高校培养适应未来需求的新型人才,广州虚拟动力推出高校元宇宙实训室解决方案,通过动作捕捉设备与虚拟数字人技术,构建沉浸式教学场景,赋…...
提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评
提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 引言豆包…...
【前端开发】query参数和params参数的区别
在Web开发中,query参数(URL查询参数)和params参数(路由参数)是两种不同的URL传参方式,它们的核心区别如下: 一、 位置不同 query参数params参数位置URL中?之后,用&连接多个参数…...
推荐系统召回算法
推荐系统召回算法 召回算法UserCFItemCFSwing矩阵分解 召回算法 基于协同过滤的召回算法主要是应用在推荐环节的早期阶段,大致可以分为基于用户、基于物品的。两者各有优劣,优点是具有较好的可解释性,缺点是对于稀疏的交互矩阵,效…...
Python基础(上)
1. 基础语法 1.1 环境安装 Python版本: 推荐使用Python 3.6.6及以上开发工具: PyCharm 1.2 基本语法 输出: print("Hello World") 注释: 单行注释: # 注释内容(快捷键 Ctrl/) 多行注释: 使用三引号 注释内容 注意:不推…...
【DuodooBMS】给PDF附件加“受控”水印的完整Python实现
给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中,许多文件需要添加水印以标识其状态,例如“受控”“机密”等。对于PDF文件,添加水印不仅可以增强文件的可识别性,还可以防止未经授权的使用。本代码的功能需求是…...
【虚幻引擎UE】UE4.23到UE5.5的核心功能变化
简单总结从UE4.23到UE5.5,虚幻引擎的重大变化: 1. WebGL/HTML5 平台支持和像素流 UE4.23-UE4.25:移除官方HTML5支持,改为社区插件维护。 但通过第三方插件(如WebAssemblyWebGPU)可在浏览器运行部分项目。U…...
阿里云《AI 剧本生成与动画创作》解决方案技术评测
引言 随着人工智能技术的发展,越来越多的工具和服务被应用于内容创作领域。阿里云推出的《AI 剧本生成与动画创作》解决方案,利用函数计算 FC 构建 Web 服务,结合百炼模型服务和 ComfyUI 工具,实现了从故事剧本撰写、插图设计、声…...
commons-io 包 IOUtils、FileUtils、FilenameUtils
1. IOUtils void IOUtils.closeQuietly(Closeable... closeables) 无条件关闭流。int IOUtils.copy(InputStream inputStream, OutputStream outputStream) 将字节从InputStream复制到OutputStream,返回复制的长度,流最大不能超过2G,默认缓冲…...
JavaScript 加密技术全面指南
一、加密技术概述 在现代 Web 开发中,加密技术在保护用户数据和确保信息安全方面发挥着至关重要的作用。本文将带您了解 JavaScript 加密技术的基本概念、分类及其在实际应用中的场景。 加密的基本概念 加密是一种将明文数据转换为密文的技术,以保护数…...
【笔记】deep-seek wechat项目
1、安装ollama ollama官网 2、ollama上部署deepseek ollama官网下载deepseek模型(我下了1.5B) 3、配置python 国内镜像源 pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ 安装依赖包 pip install wxauto pip instal…...
FloodFill算法——搜索算法
一、什么是FloodFill算法 FloodFill算法字面意思就是洪水灌溉法,比如我们有这么一块地: 0表示平原,正数表示高地,负数表示凹地,那么当洪水来临时这些凹地会被优先灌满。而我们要找的正是这些联通块,如&…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
