C++(7)—inline和nullptr

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、inline
  • 二、nullptr

前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、inline

在C++中,inline 关键字是一种函数修饰符,用于建议编译器在编译时将函数的定义直接插入到每个函数调用的地方,而不是进行常规的函数调用。这样做的目的是为了减少函数调用的开销,尤其是对于小型函数来说,因为函数调用涉及到一系列的操作,如保存寄存器、堆栈操作等,这些操作可能会抵消函数体执行的时间。

inline 关键字的主要特点:

  1. 减少开销:通过避免函数调用的额外开销,inline 函数可能提高程序的执行效率。

  2. 多个定义:与普通函数不同,inline 函数允许在程序中有多个定义点,通常是因为它们在头文件中定义,可以被包含在多个源文件中。

  3. 编译器优化inline 关键字只是一个建议,编译器可以选择忽略它。编译器会根据自己的优化策略和函数的复杂性来决定是否将函数内联。

  4. 递归限制:通常,递归函数不会被内联,因为内联递归函数可能导致无限的代码膨胀。

  5. 代码膨胀:过度使用 inline 函数可能导致代码膨胀,即程序的大小增加,这可能会增加内存使用并可能降低性能。

  6. 模板函数:模板函数默认是内联的,因为它们需要在每个实例化点展开。

inline int add(int a, int b) {return a + b;
}

在这个例子中,add 函数被声明为 inline,编译器会尝试在每个调用 add 的地方直接替换为 return a + b;

注意事项:

  • 并不是所有的函数都适合内联。大型函数的内联可能会导致代码膨胀,反而降低性能。
  • 编译器的优化技术(如分支预测、循环展开等)可能比内联更有效率。
  • 在类定义中使用 inline 关键字可以确保成员函数在头文件中定义时不会引发链接错误。

inline 关键字是C++提供的一种优化手段,但它应该谨慎使用,以确保在提高性能的同时不会带来其他问题。

#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
int ret = x + y;
ret += 1;
ret += 1;
ret += 1;
return ret;
}
int main()
{
// 可以通过汇编观察程序是否展开
// 有call Add语句就是没有展开,没有就是展开了
int ret = Add(1, 2);
cout << Add(1, 2) * 5 << endl;
return 0;
}

二、nullptr

在C++中,nullptr 是一个常量,它表示一个空指针,用于指出没有指向任何对象或函数的指针。nullptr 是 C++11 标准引入的,它提供了一种类型安全的方式来表示空指针,替代了旧式的 NULL 宏和 0 常量。

nullptr 的特点:

  1. 类型安全nullptr 可以匹配任何指针类型,但不会匹配非指针类型。这使得它比 NULL0 更安全,因为后者可以被隐式转换为任何算术类型。

  2. 统一表示nullptr 提供了一种统一的方式来表示空指针,无论指针的类型如何。

  3. 显式转换:如果需要,可以将 nullptr 显式转换为任何指针类型,这在需要明确空指针类型的情况下非常有用。

  4. 初始化nullptr 常用于初始化指针变量,表示这些指针在初始化时不指向任何对象。

  5. 比较操作nullptr 可以与任何指针类型进行比较,包括与 NULL0 比较。

  6. 模板编程:在模板编程中,nullptr 可以用于模板函数,因为它具有统一的类型。

#include <iostream>int main() {int* ptr1 = nullptr; // 初始化指针为nullptrdouble* ptr2 = nullptr; // nullptr可以用于任何类型的指针if (ptr1 == nullptr) {std::cout << "ptr1 is null" << std::endl;}// 使用nullptr作为函数参数void function(int* p) {if (p == nullptr) {std::cout << "p is null" << std::endl;}}function(ptr1);return 0;
}

注意事项:

  • nullptr 不能用于算术运算,因为它不是一个算术类型。
  • nullptr 与 NULL 或 0 在语义上是等价的,但 nullptr 是类型安全的,而 NULL 是一个宏,可能被定义为 0 或其他值。
  • 在 C++11 之前的版本中,通常使用 NULL 或 0 来表示空指针。

nullptr 是 C++ 中表示空指针的推荐方式,它提供了类型安全和统一的表示方法,使得代码更加清晰和健壮。

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot 配置跨域访问

什么是 CORS&#xff1f; CORS&#xff0c;全称是“跨源资源共享”&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种Web应用程序的安全机制&#xff0c;用于控制不同源的资源之间的交互。 在Web应用程序中&#xff0c;CORS定义了一种机制&#xff0…

Ubuntu离线安装Docker容器

前言 使用安装的工具snap安装在沙箱中&#xff0c;并且该沙箱之外的权限有限。docker无法从其隔离的沙箱环境访问外部文件系统。 目录 前言准备环境卸载已安装的Docker环境快照安装的Dockerapt删除Docker 安装docker-compose下载执行文件将文件移到 /usr/local/bin赋予执行权限…

【Unity3D】ECS入门学习(七)缓存区组件 IBufferElementData

组件继承于IBufferElementData&#xff0c;可以让一个实体拥有多个相同的组件。 using Unity.Entities;public struct MyBuffComponentData : IBufferElementData {public int num; }using System.Collections; using System.Collections.Generic; using UnityEngine; using U…

一种寻路的应用

应用背景 利用长途车进行货物转运的寻路计算。例如从深圳到大连。可以走有很多条长途车的路线。需要根据需求计算出最合适路线。不同的路线的总里程数、总价、需要的时间不一样。客户根据需求进行选择。主要有一些细节&#xff1a; 全国的长途车车站的数据的更新&#xff1a; …

15、【OS】【Nuttx】OS裁剪,运行指定程序,周期打印当前任务

背景 接之前wiki【Nsh中运行第一个程序】https://blog.csdn.net/nobigdeal00/article/details/144728771 OS还是比较庞大&#xff0c;且上面搭载了Nsh&#xff08;Nuttx Shell&#xff09;&#xff0c;需要接入串口才能正常工作&#xff0c;一般调试的时候用&#xff0c;非调试…

学习 Python 编程的规则与风格指南

文章目录 1. Python 编程规则1.1 Python 的哲学&#xff1a;The Zen of Python1.2 遵守 PEP 81.3 Python 是大小写敏感的1.4 使用 Pythonic 风格 2. Python 编程风格2.1 命名风格2.2 注释风格2.3 文档字符串&#xff08;Docstring&#xff09;2.4 空格使用2.5 文件和代码组织 3…

Seata AT 模式两阶段过程原理解析【seata AT模式如何做到对业务的无侵入】

在分布式事务中&#xff0c;Seata 的 AT 模式&#xff08;Automatic Transaction&#xff09;是一种基于两阶段提交协议的事务模式。它通过自动生成数据快照&#xff08;before image 和 after image&#xff09;&#xff0c;实现了对分布式事务的高效管理。本文将详细解析 Sea…

中关村科金外呼机器人智能沟通破解营销难题

当今&#xff0c;传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性&#xff0c;难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员&#xff0c;成为企业的难题。中关村科金外呼机器人通过智能化沟通技术&#xff0c;为企业提供了一站…

旅游景点票价预测02

5.数据预处理 经过4的数据分析环节&#xff0c;我们得出了一些和目标特征‘price’关联度比较高的特征&#xff0c;现在将这些特征列进行提取 df.head(5)# 筛选对应的数据列 rs_df df[[price,comment,sight_comment_score,level,city,address]] # 判断是否有缺失值 rs_df.isnu…

“事务认证平台”:个人日常事务管理系统的诚信体系建设

3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为个人日常事务管理系统&#xff0c;属于开放式的平台&#xff0c;所以在体系结构中采用B/s。B/s结构抛弃了固定客户端要求&#xff0c;…

单片机与MQTT协议

MQTT 协议简述 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布 / 订阅&#xff08;publish/subscribe&#xff09;模式的 “轻量级” 通讯协议&#xff0c;该协议构建于 TCP/IP 协议上&#xf…

小程序基础 —— 07 创建小程序项目

创建小程序项目 打开微信开发者工具&#xff0c;左侧选择小程序&#xff0c;点击 号即可新建项目&#xff1a; 在弹出的新页面&#xff0c;填写项目信息&#xff08;后端服务选择不使用云服务&#xff0c;开发模式为小程序&#xff0c;模板选择为不使用模板&#xff09;&…

【js】记录预览pdf文件

接口调用拿到pdf的文件流&#xff0c;用blob处理这个文件流拿到url&#xff0c;使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…

“拍卖认证平台”:网上拍卖系统的诚信体系建设

2.1 B/S结构介绍 在早期&#xff0c;一些使用HTML语言编写的文件&#xff0c;再集合一些其它资源文件就可以组成一个最简单的Web程序&#xff0c;了解了Web程序也需要了解Web站点&#xff0c;它们之间的关系就是一个或者多个Web程序可以放在Internet上的一个Web站点&#xff08…

【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火

&#xff1a;羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言&#xff1a; 在当今数字化的时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师&#xff0c;…

C++:单例模式

创建自己的对象&#xff0c;同时确保对象的唯一性。 单例类只能有一个实例☞静态成员static☞静态成员 必须类外初始化 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 静态成员类内部可以访问 构造函数私有化☞构造函数私有外部不能创建&#x…

day26 文件io

函数接口 1 .open和close 文件描述符&#xff1a;系统为用open打开的文件分配的标识符 非负的整形数据 0-1023 最小未被使用原则 使用完时及时释放&#xff0c;避免文件描述符溢出 文件描述溢出就是文件使用完没有及时关闭文件 int open(const char *pathname, int flags); /…

mysql索引的理解

1、索引是什么&#xff1f; 索引&#xff1a;简单理解就是我们字典的目录&#xff0c;一个索引可以找得到多个记录。 作用加快我们数据库的查询速度。索引本身较大&#xff0c;往往存储在磁盘的文件里。可能存储在单独的索引文件中&#xff0c;也可能和数据一起存储在数据文件…

Leetcode打卡:查询数组中元素出现的位置

执行结果&#xff1a;通过 题目 3159 查询数组中元素出现的位置 给你一个整数数组 nums &#xff0c;一个整数数组 queries 和一个整数 x 。 对于每个查询 queries[i] &#xff0c;你需要找到 nums 中第 queries[i] 个 x 的位置&#xff0c;并返回它的下标。如果数组中 x 的出…