C++从入门到起飞之——inline/nullptr关键字全方位剖析!

 

                                                                                个人主页:秋风起,再归来~

                                                                                           C++从入门到起飞                         

                                                                        个人格言:悟已往之不谏,知来者犹可追

                                                                                        克心守己,律己则安!

目录

1、inline

2、nullptr 

3.完结散花


1、inline

• ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就不需要建⽴栈帧了,就可以提⾼效率。

inline int func(int x,int y)
{int ret = x + y;ret += 1;ret += 1;ret += 1;return ret;
}int main()
{//可以通过反汇编观察程序是否展开// 有call func语句就是没有展开,没有就是展开了func(1,1);return 0;
}

 注意:为什么这里加了inline,函数还是没有展开,依然去调用了呢?

这是因为vs编译器debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下 以下两个地⽅。

 好啦,设置好了我们直接来看一下func是否被展开了~

• C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调 试,C++设计了inline⽬的就是替代C的宏函数。

• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

 好啦,如果我们在原来的函数上多加一些语句,看看编译器还会不会展开函数呢?

• inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地 址,链接时会出现报错。

2、nullptr 

NULL实际是⼀个宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码:

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

C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。不论采取何种 定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的 f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL); 调⽤会报错。

void func(int x = 0)
{cout << "void func(int x = 0)" << endl;
}void func(int* ptr)
{cout << "void func(int* ptr)" << endl;
}int main()
{func(0);// 本想通过f(NULL)调⽤指针版本的func(int*)函数,// 但是由于NULL被定义成0,调⽤了func(int x),因此与程序的初衷相悖。func(NULL);return 0;
}

>本想通过f(NULL)调⽤指针版本的func(int*)函数,但是由于NULL被定义成0,调⽤了func(int x),因此与程序的初衷相悖。 

 >必须将NULL强制类型转化为int*的指针才能达到我们的目的

• C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被 隐式地转换为指针类型,⽽不能被转换为整数类型。

>最后这里再讲一个小的知识点:在C++中(void*)类型的指针不能给给其他类型的指针,而在C语言中是可以的

在C++中

只能通过强转来解决~ C++在这方面检查的比较严格!

在C语言中 

3.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

​​​​

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

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

相关文章

苹果手机的微信过期文件怎么恢复?3个小窍门,让你快速找回

在微信APP里&#xff0c;发送过的文件只能储存7天&#xff0c;7天之后就会自动清除&#xff0c;导致无法打开。那么&#xff0c;微信过期文件怎么恢复呢&#xff1f;别担心&#xff0c;今天我们就来分享3个实用的小窍门&#xff0c;帮助你轻松恢复苹果手机上过期的微信文件。赶…

React Native 自定义 Hook 获取组件位置和大小

在 React Native 中自定义 Hook useLayout 获取 View、Pressable 等组件的位置和大小的信息 import {useState, useCallback} from react import {LayoutChangeEvent, LayoutRectangle} from react-nativeexport function useLayout() {const [layout, setLayout] useState&l…

springcolud学习03Eureka

Eureka 模块 来实现服务治理 服务治理就是提供了微服务架构中各微服务实例的快速上线或下线且保持各服务能正常通信的能力的方案总称 建立eureka模型 导入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XM…

Linux 上 TTY 的起源

注&#xff1a;机翻&#xff0c;未校对。 What is a TTY on Linux? (and How to Use the tty Command) What does the tty command do? It prints the name of the terminal you’re using. TTY stands for “teletypewriter.” What’s the story behind the name of the co…

浅谈Visual Studio 2022

Visual Studio 2022&#xff08;VS2022&#xff09;提供了众多强大的功能和改进&#xff0c;旨在提高开发者的效率和体验。以下是一些关键功能的概述&#xff1a;12 64位支持&#xff1a;VS2022的64位版本不再受内存限制困扰&#xff0c;主devenv.exe进程不再局限于4GB&#xf…

SQL常用数据过滤---IN操作符

在SQL中&#xff0c;IN操作符常用于过滤数据&#xff0c;允许在WHERE子句中指定多个可能的值。如果列中的值匹配IN操作符后面括号中的任何一个值&#xff0c;那么该行就会被选中。 以下是使用IN操作符的基本语法&#xff1a; SELECT column1, column2, ... FROM table_name WH…

用Vue3和WebCola实现3D图的在线展示

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于Cola.js的网络图绘制 应用场景 Cola.js是一个JavaScript库&#xff0c;用于绘制交互式网络图。它广泛应用于社交网络、知识图谱、生物网络等领域&#xff0c;帮助用户可视化和探索复杂的数据关系。 基本…

c语言唯一一个三目运算符

条件表达式由两个符号&#xff08;&#xff1f;和&#xff1a;&#xff09;组成&#xff0c;必须一起使用。要求有三个操作对象&#xff0c;称为三目运算符。 一般形式为 表达式1&#xff1f;表达式2&#xff1a;表达式3 理解如下&#xff1a; a>b?(maxa):(maxb); //相当…

用AI生成Springboot单元测试代码太香了

你好&#xff0c;我是柳岸花开。 在当今软件开发过程中&#xff0c;单元测试已经成为保证代码质量的重要环节。然而&#xff0c;编写单元测试代码却常常让开发者头疼。幸运的是&#xff0c;随着AI技术的发展&#xff0c;我们可以利用AI工具来自动生成单元测试代码&#xff0c;极…

JS+CSS特效:HTML+JS+CSS 实现精致的带二级菜单的头部菜单

本篇&#xff0c;我们来演示一个二级菜单是怎么做出来的。 案例效果图 因为本次内容主要目标是实现顶部的导航菜单&#xff0c;所以我们不关心其他内容。 第一步&#xff1a;清除浏览器默认样式 & 添加基本样式 *{ margin: 0px; padding: 0px; box-sizing: border-box; …

万界星空科技电线电缆行业MES系统核心功能

在日新月异的科技浪潮中&#xff0c;电线电缆行业作为国民经济的重要支柱&#xff0c;正面临着前所未有的挑战与机遇。如何在激烈的市场竞争中脱颖而出&#xff0c;实现生产效率与产品质量的双重飞跃&#xff0c;成为了每一家线缆企业亟需解决的课题。万界星空科技&#xff0c;…

电池放电倍率

电池放电倍率是指电池在单位时间内放电的速率与其额定容量之比 &#xff0c;放电倍率越大&#xff0c;表示电池能够在较短的时间内释放更多的电能。一般来说&#xff0c;电池的放电倍率会影响其使用时的性能和寿命。 电池的放电倍率主要取决于其设计和制造工艺。一般来说&#…

Github 2024-07-17 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-17统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目3Python项目3Rust项目2TypeScript项目2MDX项目1项目化学习 创建周期:2538 天协议类型:MIT LicenseStar数量:161973 个Fork数量…

气象数据文件名解析:使用正则表达式提取时间信息

气象数据文件名解析&#xff1a;使用正则表达式提取时间信息 前言 在处理大量气象数据文件时&#xff0c;文件名往往携带了关键的元数据信息&#xff0c;如日期、时间、地点、测量设备等。其中&#xff0c;时间信息尤为重要&#xff0c;因为它帮助我们理解数据的时效性和用于…

2024 50+行业大模型应用解决方案全解

第一章&#xff1a;以“生成”能力赋能产业智慧化 从当前大模型的行业应用发展中可以看到&#xff0c;现阶段的大模型更适合于企业的“生成”任务&#xff0c;而非“决策”任务。 “生成”任务主要指文本生成、对话系统、语言翻译等&#xff0c;大模型可以通过分析大量文本数…

算法项目报告:物流中的最短路径问题

问题描述 物流问题 有一个物流公司需要从起点A到终点B进行货物运输&#xff0c;在运输过程中&#xff0c;该公司需要途径多个不同的城市&#xff0c;并且在每个城市中都有一个配送站点。为了最大程度地降低运输成本和时间&#xff0c;该公司需要确定经过哪些配送站点&#xff…

<数据集>猫狗识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3686张 标注数量(xml文件个数)&#xff1a;3686 标注数量(txt文件个数)&#xff1a;3686 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cat, dog] 序号类别名称图片数框数1cat118811892dog24982498 使用标…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中&#xff0c;语言是连接我们的桥梁。印尼语翻译通&#xff0c;一款专为打破语言障碍而生的智能翻译软件&#xff0c;让您与印尼语的世界轻松接轨。无论是商务出差、学术研究&#xff0c;还是探索印尼丰富的文化遗产&#xff0c;印尼语翻译通都是您的…

win10安装Docker Desktop启动失败闪退解决方案和Docker Desktop历史版本下载

我的系统是Windows 10 专业版&#xff0c;最近想安装docker desktop&#xff0c;安装最新版本后启动不了&#xff0c;一直报WSL update failed&#xff0c;过一会还闪退&#xff0c;百度各种方法还是没办法解决。 解决方法&#xff1a; 最后安装旧版本才正常启动&#xff08;…

怎么注册一个小程序

目录 开始申请账号选择注册的账号类型填写邮箱和密码激活邮箱填写主体信息选择主体类型 安装开发工具你的第一个小程序编译预览相关链接 开始 开发小程序的第一步&#xff0c;你需要拥有一个小程序账号&#xff0c;通过这个账号你就可以管理你的小程序。 跟随这个教程&#x…