C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

6. 内联函数

        在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数,就是在编译时C++编译器会将函数体在调用内联函数的地方展开,从而省去了调用函数的栈帧开销,提高程序运行效率。

inline int Add(int a, int b)
{return a + b;
}
int main()
{int c = 0;c = Add(1, 2);return 0;
}

        对上述代码,在Debug版本下,我们观察汇编代码,发现仍然调用了函数Add而不是我们希望的内联展开形式。

        这是因为内联函数展开后就不可调试了,而Debug版本为了方便我们调试,因此忽略了inline的选项。为了可以看到内联函数的变化,我们可以做出如下设定,再在X86环境下编译程序,这样Debug版本也可以实现内联了。或者使用release版本也可以,release会自动对其进行优化,变为内联展开。

        对内联函数做以总结:

①内联函数inline实际上是一种以空间换时间的做法,因为编译器在处理内联函数时会使用函数体替换函数调用,这样会使得目标文件变大,但是省去了调用,提高了效率。

②对于inline的使用,一般将规模小、非递归、频繁调用的函数采取inline修饰。而且inline修饰并不是一定会替换调用,只是向编译器表达内联的希望,具体是否内联要取决于编译器,所以复杂又庞大的函数编译器会忽略内联的请求。 

③inline不建议声明与定义分离,这可能会导致需要展开函数时找不到函数体导致链接错误。

7. auto关键字

        在C语言中变量一般有三种类型:①auto:自动变量(局部变量),一般省略不写;②static:静态区变量;③extern:外部变量。在C++中,对auto做了新的定义,auto是类型指示符,他可以充当类型声明的占位符,根据初始化类型替换为实际类型。

int func()
{return 9;
}
int main()
{//auto可以根据初始化表达式推导实际类型auto a = 1;auto b = 1.24;auto c = "hello";auto d = func();//typeid(变量).name()  可以打印出符号的类型cout << typeid(a).name() << endl;	//intcout << typeid(b).name() << endl;	//doublecout << typeid(c).name() << endl;	//char const* __ptr64cout << typeid(d).name() << endl;	//intreturn 0;
}

        在使用auto时需要注意以下几点:

①在使用auto来声明指针变量的时候,*号个数应小于等于指针级数,例如对四级指针,auto后的*小于等于4个都是可以的,但是不可以大于4个。

int main()
{int a = 1;auto p1 = &a;auto* p2 = &a;//auto* p3 = a; //errorauto p3 = &p1;auto p4 = &p3;auto*** p5 = &p3;//auto**** p6 = &p3; //errorcout << typeid(p1).name() << endl;	//int * __ptr64cout << typeid(p2).name() << endl;	//int * __ptr64cout << typeid(p3).name() << endl;	//int * __ptr64 * __ptr64cout << typeid(p4).name() << endl;	//int * __ptr64 * __ptr64 * __ptr64cout << typeid(p5).name() << endl;	//int * __ptr64 * __ptr64 * __ptr64return 0;
}

 ②在使用auto声明引用类型时,必须要加&。

int main()
{int a = 1;auto& ra = a;cout << typeid(ra).name() << endl;	//intreturn 0;
}

③当使用auto定义多个变量时,该行变量类型应该相同,因为编译器只会对第一个类型推导,然后以此结论定义剩下的变量。

int main()
{auto a = 1, b = 8;//auto c = 'k', d = 1.3; //errorreturn 0;
}

④auto可以作为函数的返回类型,但不可以作为形参的类型。auto也不可以用来声明数组类型。

auto func1()
{return 1;
}
//int func2(auto c) error
//{
//	return 2;
//}
int main()
{auto a = func1();cout << typeid(a).name() << endl;	//int//auto b = func2(a);//auto arr[3] = {1, 2, 3};	//errorreturn 0;
}

8.基于范围的for循环

        基于范围的for循环括号内冒号前是用于迭代的变量,冒号后是迭代的范围,也可以使用continue和break进行控制。暂时只介绍到数组,循环是从数组第一个元素到最后一个。

int main()
{int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//1.一般的for循环for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)cout << arr[i] << ' ';cout << endl;//2.基于范围的for循环for (int num : arr) //类似于python  ---  for num in arr:cout << num << ' ';cout << endl;return 0;
}

9.空指针nullptr

        在C语言我们所使用的空指针NULL实际上是一个宏,它可能被定义为0,同时也可能被定义为((void*)0)这样一个无类型指针。因此引入nullptr,定义它为((void*)0),代替以往NULL的使命。nullptr在C++中作为关键字存在。

void func(int a)
{cout << "int" << endl;
}
void func(int* a)
{cout << "int*" << endl;
}
int main()
{func(0);			//intfunc(NULL);			//intfunc((int*)NULL);	//int*func(nullptr);		//int*
}

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

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

相关文章

Ansible user 模块 该模块主要是用来管理用户账号

目录 参数语法验证创建用户删除用户验证 删除用户 参数 comment  # 用户的描述信息 createhome  # 是否创建家目录 force  # 在使用stateabsent时, 行为与userdel –force一致. group  # 指定基本组 groups  # 指定附加组&#xff0c;如果指定为(groups)表示删除所有…

Camunda7.18流程引擎启动出现Table ‘camunda_platform_docker.ACT_GE_PROPERTY‘的解决方案

文章目录 1、问题描述2、原因分析3、解决方案3.1、方案一&#xff1a;降低mysql版本3.2、方案二&#xff1a;增加nullCatalogMeansCurrent参数&#xff08;推荐&#xff09; 4、总结 1、问题描述 需要在docker中&#xff0c;部署Camunda流程引擎。通过启动脚本camunda-platfor…

【C++】类和对象之拷贝构造函数篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 传值传参和传引用传参3. 概念4. 特征 1. 前言 在前面学习了6个默认成员函数中的构造函数和析构函数 【C】构造函数和析构函数详解&#xff0c;接下来继续往后看拷…

Github 2024-02-21 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-21统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目8非开发语言项目1TypeScript项目1 gpt4free 语言模型集合改进计划 创建周期&#xff1a;300 天开…

<网络安全>《51 网络攻防专业课<第十四课 - 华为防火墙的使用(4)>

8 防火墙的防范技术&#xff08;3&#xff09; 8.1 IP spoofing攻击防范 攻击介绍 为了获得访问权&#xff0c;或隐藏入侵者的身份信息&#xff0c;入侵者生成带有伪造源地址的报文。 处理方法 检测每个接口流入的IP报文的源地址与目的地址&#xff0c;并对报文的源地址反查路…

【图论】【堆优化的单源路径】LCP 20. 快速公交

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 LCP 20. 快速公交 小扣打算去秋日市集&#xff0c;由于游客较多&#xff0c;小扣的移动速度受到了人流影响&#xff1a; 小扣从 x 号站点移动至 x 1 号站点需要花费的时间为 inc&#xff1b; 小扣从 x 号站…

计算机组成原理(14)----总线

目录 一.总线的物理实现 二.总线概述 三.总线的特性 四.总线的分类 &#xff08;1&#xff09;按数据传输格式分类 •串行总线 •并行总线 &#xff08;2&#xff09;按总线功能分类 •片内总线 •系统总线 系统总线的结构 •通信总线 &#xff08;3&#xff09;按…

从软硬件以及常见框架思考高并发设计

目录 文章简介 扩展方式 横向扩展 纵向扩展 站在软件的层面上看 站在硬件的层面上看 站在经典的单机服务框架上看 性能提升的思考方向 可用性提升的思考方向 扩展性提升的思考方向 文章简介 先从整体&#xff0c;体系认识&#xff0c;理解高并发的策略&#xff0c;方…

深入理解JS的执行上下文、词法作用域和闭包(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ARM Cortex-X5 传言表现不佳,高功率浪涌和低多核分数影响即将推出的核心设计

ARM 的新 Cortex-X5 设计似乎遇到了问题&#xff0c;有新的传言称&#xff0c;超级核心在提高时钟速度时会经历严重的高功耗&#xff0c;并且当最大功率限制降低时&#xff0c;多核性能会下降。虽然这对高通来说可能不是问题&#xff0c;因为据说其 Snapdragon 8 Gen 4 采用定制…

华为HCIP Datacom H12-831 卷24

多选题 1、如图所示&#xff0c;某园区部署OSPF实现网络互通&#xff0c;其中Area1部署为NSSA区域。某工程师为了实现R1访问R4的环回口地址&#xff0c;在R4的OSPF进程中引入直连路由。以下关于该场景的描述,错误的有哪些项? A、在R4引入直连路由后&#xff0c;R1通过转换后的…

服务区智慧公厕

在如今追求智能化、便捷化的社会背景下&#xff0c;高速公路服务区智慧公厕正成为人们关注的焦点。作为高速公路上的必要设施&#xff0c;公厕的提升已经不再局限于简单的清洁卫生&#xff0c;而是更多地涉及到智能化、舒适度和用户体验。本文以智慧公厕源头厂家广州中期科技有…

华为---RSTP(三)---P/A机制及RSTP的生成树形成过程

目录 1. P/A机制简介 1.1 P/A机制的作用 1.2 P/A协商的前提条件 1.3 RSTP选举思路 2. P/A协商过程 3. 举例说明RSTP的生成树形成过程 3.1 示例环境要求 3.2 RSTP的生成树形成过程 3.2.1 SW和SW1之间链路上抓包分析 3.2.2 SW和SW2之间链路上抓包分析 3.2.3 SW1和SW2之…

CSS重点知识整理1

目录 1 平面位移 1.1 基本使用 1.2 单独方向的位移 1.3 使用平面位移实现绝对位置居中 2 平面旋转 2.1 基本使用 2.2 圆点转换 2.3 多重转换 3 平面缩放 3.1 基本使用 3.2 渐变的使用 4 空间转换 4.1 空间位移 4.1.1 基本使用 4.1.2 透视 4.2 空间旋转 4.3 立…

Type-C连接器笔记

一、Type-C的介绍 Type-C是一种全新的USB接口形式&#xff0c;由USB Implementers Forum&#xff08;USB-IF&#xff09;制定&#xff0c;并在2014年获得苹果、谷歌、英特尔、微软等厂商支持后开始普及。它是一种通用串行总线&#xff08;USB&#xff09;的硬件接口规范&#x…

Stable Diffusion 3 发布及其重大改进

1. 引言 就在 OpenAI 发布可以生成令人瞠目的视频的 Sora 和谷歌披露支持多达 150 万个Token上下文的 Gemini 1.5 的几天后&#xff0c;Stability AI 最近展示了 Stable Diffusion 3 的预览版。 闲话少说&#xff0c;我们快来看看吧&#xff01; 2. 什么是Stable Diffusion…

React18源码: Fiber树中的全局状态与双缓冲

Fiber树构造 在React运行时中&#xff0c;fiber树构造位于 react-reconciler 包在正式解读 fiber 树构造之前&#xff0c;再次回顾一下renconciler的4个阶段 1.输入阶段&#xff1a;衔接react-dom包&#xff0c;承接fiber更新请求2.注册调度任务&#xff1a;与调度中心(schedu…

JavaScript+PHP实现视频文件分片上传

摘要 视频文件分片上传&#xff0c;整体思路是利用JavaScript将文件切片&#xff0c;然后循环调用上传接口 upload.php 将切片上传到服务器。这样将由原来的一个大文件上传变为多个小文件同时上传&#xff0c;节省了上传时间&#xff0c;这就是文件分片上传的其中一个好处。 上…

STL容器之list

​ 1.封装除了对数据的保护、更好地管理数据之外&#xff0c;还有实现了对上层的统一&#xff1b; ​ 2.类模板参数的不同&#xff0c;一方面是为了实例化出来不同的类&#xff0c;另一方面是为了实现类的成员函数的不同&#xff1b; 一、认识list ​ 1.list是一种带头双向循…

Qt的QFileSystemModel与QTreeView、QTableView、QListView的组合使用

1.相关描述 QFileSystemModel与QTreeView、QTableView、QListView的组合&#xff0c;当QTreeView点击发生改变&#xff0c;QTableView和QListView也会发生变化 2.相关界面 3.相关代码 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h"…