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表示平原,正数表示高地,负数表示凹地,那么当洪水来临时这些凹地会被优先灌满。而我们要找的正是这些联通块,如&…...
Pytorch图像去噪实战(七十四):Kubernetes部署图像去噪服务,实现容器编排和弹性扩展
Pytorch图像去噪实战(七十四):Kubernetes部署图像去噪服务,实现容器编排和弹性扩展 一、问题场景:Docker Compose够用,但多服务扩展开始吃力 前面我们用 Docker Compose 部署了图像去噪服务。 Compose 对单机部署非常好用,但当项目变复杂后,会遇到: 多台机器部署困难…...
公交查询|智能公交|公交线路查询|基于SprinBoot+vue智能公交系统(源码+数据库+文档)
公交查询|智能公交|公交线路查询系统 目录 基于SprinBootvue智能公交系统 一、前言 二、系统设计 三、系统功能设计 1用户模块实现 2管理员服务端模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介…...
普遍认为赠送福利越多客户留存越高,编程统计福利投入,客户留存数据过度福利,会造成客户贪婪流失率上升。
“福利投入强度与客户留存的非线性关系分析” 为主题。一、实际应用场景描述(Business Context)在 SaaS、电商、会员制平台、在线教育等商业场景中,赠送福利(优惠券、积分、试用权益、赠品等)被广泛用于:- …...
IDEA里Artifact选war还是war exploded?一个设置解决Tomcat热部署难题
IDEA中Artifact选择:war与war exploded深度解析与热部署实战 每次修改完JSP页面后都要重启Tomcat?看着进度条缓慢加载,开发效率被硬生生拖慢。这可能是大多数Java Web开发者都经历过的痛苦。问题的根源往往藏在IDEA那个不起眼的Artifact配置选…...
从零构建Telegram天气机器人:Python异步编程与API集成实战
1. 项目概述:一个能聊天的天气机器人 如果你用过Telegram,大概率会见过或者用过一些机器人。它们能帮你查新闻、翻译、管理任务,甚至陪你聊天。今天要聊的这个项目, imkarimkarim/Telegram-Weather-Bot ,就是一个典型…...
Midjourney Basic计划真实体验:7天高强度测试+37组对比图,揭示隐藏限制与生产力断层
更多请点击: https://intelliparadigm.com 第一章:Midjourney Basic计划真实体验:7天高强度测试37组对比图,揭示隐藏限制与生产力断层 过去一周,我以全职创作者身份深度使用 Midjourney Basic 计划($10/月…...
Spinach印相紧急修复方案:当--v 6.2输出突然丢失青橙分离感时,立即执行的4步CLI热补丁与config.json强制回滚指令
更多请点击: https://intelliparadigm.com 第一章:Spinach印相紧急修复方案:当--v 6.2输出突然丢失青橙分离感时,立即执行的4步CLI热补丁与config.json强制回滚指令 Spinach 6.2 版本在部分 GPU 加速路径下会因色彩空间映射缓存污…...
动态架构跳跃:让视觉语言大模型高效适配垂直领域任务
1. 项目概述:从“大而全”到“快而准”的模型进化之路 在视觉语言预训练模型(Vision-Language Pre-trained Models, VLPMs)如CLIP、ALIGN等席卷多模态领域的今天,一个核心的工程与学术困境日益凸显:这些动辄数十亿参数…...
LazyLLM:低代码多智能体应用开发框架实战指南
1. 项目概述:LazyLLM,一个为懒人开发者准备的多智能体应用构建工具如果你和我一样,在尝试构建一个基于大语言模型的智能应用时,感到头大——不是被各种框架的API调用搞晕,就是被模型部署、服务编排、数据流设计这些工程…...
AI时代开发者必备:生成式AI应用与核心工程能力双螺旋进阶
1. 项目概述:当AI成为你的新同事最近和几个带团队的朋友聊天,发现一个挺有意思的现象:团队里那些能熟练把AI工具“用起来”的开发者,和那些还在“观望”甚至“抵触”的开发者,在项目交付效率、问题解决深度上ÿ…...
