C++入门(2/2)

2023-10-29

目录

一.内联函数

二.auto关键字(C++11)

三.范围for

四.nullptr


一.内联函数

C++用inline修饰的函数,会在编译时在调用内联函数的地方展开,没有了函数调用建立栈帧的开销,内联函数提升程序运行的效率。

对于一个短小的函数例如Swap(),如果高频调用,那么

C语言的优化方案是————宏函数;

C++的优化方案是————inline 内联函数;

而对于宏函数 虽然它有着

a.代码可维护性(改一个则改了全部 #define DataType int ),增强了代码的复用性。

b.提高效率,减少了栈帧开销。

的优点

但是他有很多缺点,比如:

a.可读性差

b.没有类型安全检查

c.不方便调试(因为预编译阶段就替换掉了)

小插曲:还记得定义一个ADD宏的写法吗?  

#define ADD(a,b) ((a)+(b))       没有分号

到了C++中,我们以后就不要再使用宏了,以免造成不必要的麻烦。

在《effective C++》中,有一个条款说明了:“尽量用const 、enum、inline去替代宏” 

注意:

1.inline是以空间换时间的做法,如果把函数内联处理了,在编译阶段会用函数体代替调用函数(我们可以在编译器中查看汇编代码中有没有用call来判断是否调用了函数)。

2.inline对于编译器而言就是一个 建议 ,不同编译器对于inline实现机制可能不同,一般建议将函数规模小(其实函数规模算不算小这点还是由编译器说了算)、不是递归且频繁调用的函数进行inline处理。

注意!!!———如果编译器认为你这个函数内敛之后得不到什么优化(如所有递归函数),那它就会忽略inline请求,而是老老实实去调用函数创建栈帧。

3.inline函数声明和定义不能分开,否则会导致链接错误

因为inline在调用时会展开,就没有函数地址了,链接时找不到(符号表里面没有它的函数地址)

二.auto关键字(C++11)

自动识别类型关键字 auto

使用场景:

1.范围for 

例子:

int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,9,1,2,3,54 };
	for (auto e : a)//这里的原理是:自动取a的的数据赋值给e
	{
		cout << e << " ";
	}//自动迭代,自动判断结束。
	cout << endl;
	return 0;
}

2.类型比较长的时候,auto可以自动推导

3.对于下面这几个auto写法,要注意他所代表的意义

int x = 10;
auto a = x;//auto自动识别为int
auto pa = &a;//auto自动识别为int*
auto* pa1 = &a;//auto* 自动识别为int*,*的作用是 强调 pa1是个指针
auto& c = x;//auto&自动识别为int& ,&的作用是 强调c是个引用。

三.范围for

范围for其实是比较复杂的,我们现在入门先了解一下

以后遍历数组可以直接写成这样子:

//范围for再熟悉
int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,91,0,2,5,1,65,165 };
	for (auto e : a)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;
 }

 范围for的原理就是:

1.范围for自动知道数组中的元素的个数。

2.自动把数组的每一个元素迭代一次。

四.nullptr

空指针

以后再C++中空指针不要再写成NULL了,需要写成nullptr。  

因为NULL其实是C语言中定义的一个宏,他的值为0,。所以有可能导致再使用时被误认为是 int 0之类的东西。

而nullptr就是纯粹的空指针。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++入门(2/2) 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • 1、两数之和

    题目 法1 暴力解法 用两个for循环 缺点 时间复杂度高 法1 推荐 nums list map int input split target int input for i in range len nums 1 for j in ra
  • VBA宏之自动抓取关键文字并填充到指定单元格

    需求如下 最后一列字段名称为 IPTV 判断最后的数据是在哪一行 某两列中筛选含有 IPTV 或 TV 最后一列对应就为 IPTV 否则为空 最后生成的结果另存为指定日期名称的Excel文件 Sub 判断平台是否为IPTV 定义变量 Dim
  • VirtualBox压缩VDI文件 VDI文件瘦身方法

    VirtualBox压缩VDI文件 VDI文件瘦身方法 一 WINDOWS 下压缩 VDI 文件 1 在虚拟机中 右键计算机 gt 管理 gt 磁盘管理 2 右键所有磁盘 压缩卷 把所有磁盘压缩到最小 3 在未分配空间上右键新建卷 4 低级
  • c# Lambda

    分配给委托类型 Func
  • 三种公钥密码体系(传统公开密钥体系 / 基于身份的公开密钥体系 / 基于无证书的公开密钥体系 )

    公开密钥体系 分类 基于证书的公开密钥体系 基于身份的公开密钥体系 基于无证书的公开密钥体系 基于证书的公开密钥体系 第一种方案是采用证书机制实现用户的身份和用户的钥匙之间的安全对应 证书机制一般都采用公钥基础设施 Public Key I
  • 开心档之Bootstrap4 自定义表单

    Bootstrap4 自定义表单 Bootstrap4 可以自定义一些表单的样式来替换浏览器默认的样式 自定义复选框 如果要自定义一个复选框 可以设置 div 为父元素 类为 custom control 和 custom checkbox
  • 如何让FasterTransformer支持动态batch和动态sequence length

    FasterTransformer 算子 nvidia在开源的FasterTransformer的代码中 提供tensorrt和tensorflow的自定义算子编译和py调用示例 详见FasterTransformer py 但是如果使用t
  • openwrt编译环境搭建

    openwrt编译环境搭建 1 虚拟机安装 请参考网络上的资料进行安装 2 ubuntu安装 请参考网络上的资料进行安装 3 ubuntu下安装相关的编译环境 若是编译环境没有准备好 在后来的操作中会出现一些问题 sudoapt get i
  • 什么是4K HDR?HDR10+、HDR10 PRO、杜比视界HDR区别

    转自 https www sohu com a 255875615 200013 这一篇继续围绕4K给大家讲一下4K中的4K HDR HDR10 HDR10 都是什么意思 关于更多4K HDR相关资料和视频电影请到 Hao4K https
  • Angular进阶技术之模块化及懒加载

    Angular组件模块化以及路由懒加载 前提摘要 模块化的场景 NgModule 引发的思考 如何去定义模块和模块化的作用 Angular模块化以及路由懒加载 延伸 子组件模块 二级路由懒加载模块 模块化引申 一些命令和tips 本地发布测
  • 第六章 修改表

    文章目录 第六章 修改表 1 修改表的数据类型 2 添加列 3 修改列的位置 4 修改列名和数据类型 5 删除列 6 设置主键 7 设置唯一键 8 使列具有自动连续编号功能 9 设置默认值 10 关于索引的操作 第六章 修改表 1 修改表的
  • cad中tk什么意思_cad图纸中各种字母是什么意思

    展开全部 ACE 在能进入的bai吊顶在敷du设 BC 暗敷 梁zhi内 CLC 暗敷设在dao柱子内 we 暗敷设在墙回内 WE 沿墙明敷答设 FC 预埋在地面内 BE 沿屋架或跨屋架敷设 CLE 沿柱或跨柱敷设 WE 沿墙面敷设 CE
  • PCL 欧式聚类分割

    目录 一 算法原理 1 实现流程 2 实现方法 3 核心代码 4 参考文献 二 代码实现 三 结果展示 四 应用案例 五 保存结果 六 不调库实现 一 算法原理 1 实现流程 欧式聚类是一种基于欧氏距离度量的聚类算法 基于KD Tree的近
  • Docker 入门到实战教程(一)介绍Docker

    一 Docker简介 1 1 什么是虚拟化 在计算机中 虚拟化 英语 Virtualization 是一种资源管理技术 是将计算机的各种实体资源 如服务器 网络 内存及存储等 予以抽象 转换后呈现出来 打破实体结构间的不可切割的障碍 使用户
  • hadoop web查看集群datanode 信息不全

    环境说明 同一主机上 两台ubuntu虚拟机 问题 启动Hadoop后 两个节点上的jps查看进程正常 可web登录50070端口 查看的datanode information 只显示的本机上的datanode信息 namenode上jp
  • Serializable序列化实例

    需要序列化的对象 package com zizhu import java io Serializable public class SerializableHello implements Serializable private st
  • 工具类——Java导出EXCEL2(设置样式、加载并填充图片、加载指定模板、大数据量设置窗口大小与刷新频率)

    文章目录 一 POI设置样式 二 POI导出图片 1 解释XSSFClientAnchor 三 加载指定模板导出 四 Workbook XSSFWorkbook与SXSSFWorkbook 1 大数据量导出 1 根据数据量选择XSSFWor
  • ora-12801错误

    今天开发人员遇到如下错误 SQL gt SELECT from 2 FT SB FCS C 3 FT DJ FCDJ D 4 WHERE C YXBZ Y 5 AND C CQZH D FCDJXH 6 AND D ZYBZ Y 7 AND
  • Stress-ng

    介绍如何在 Linux 系统上使用 stress ng 负载测试工具 产生 CPU 内存等资源满载的状况 stress ng stress ng 与旧的 stress 都可以用来产生系统负载 但新的 stress ng 功能较丰富 所以这里
  • C++入门(2/2)

    目录 一 内联函数 二 auto关键字 C 11 三 范围for 四 nullptr 一 内联函数 C 用inline修饰的函数 会在编译时在调用内联函数的地方展开 没有了函数调用建立栈帧的开销 内联函数提升程序运行的效率 对于一个短小的函