C++:内联函数inline,auto关键字,基于范围的for循环,nullpter

文章目录

    • 1.内联函数 inline
      • 1.1 概念
      • 1.2查看方法
      • 1.3 特性
      • 1.4 题外话:宏
    • 2.auto关键字
      • 2.1 auto 简介
      • 2.2 auto使用细则
    • 3. 基于范围的for循环
    • 4. nullpter

1.内联函数 inline

1.1 概念

inline int Add(int x, int y)
{return x + y;
}
int main(){int ret = 0;ret = Add(1, 2);return 0;
}

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

1.2查看方法

在release模式下,查看编译器生成的汇编代码中是否存在call Add
在debug模式下需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2022的设置方式)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

未使用内联函数,汇编指令如下:
在这里插入图片描述
使用了 inline函数就会直接展开, 如下:
在这里插入图片描述

1.3 特性

  1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用

缺陷:可能会使目标文件变大
优势:少了调用开销,提高程序运行效率

  1. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性(一个75行的函数不大可能会展开)
  2. inline不建议声明和定义分离分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

1.4 题外话:宏

QA:宏有什么优缺点?

优点:
1.增强代码的复用性。
2.提高性能。

缺点:

  1. 不方便调试宏 。(因为预编译阶段进行了替换)
  2. 导致代码可读性差,可维护性差,容易误用。
  3. 没有类型安全的检查 。

针对宏的优缺点,在C++就可以使用内联函数,在有宏的优点时,也能避免宏的缺点。

常量定义 换用const enum也能替换宏

2.auto关键字

2.1 auto 简介

auto为一个新的类型指示符,auto修饰的变量,是具有自动存储器的局部变量,能自动识别被赋的值的类型而为其赋值
auto声明的变量必须由编译器在编译时期推导而得。

int main(){int a = 10;double b = 10;auto New_a = a;auto New_b = b;cout << typeid(a).name() <<" " << typeid(New_a).name() << endl;cout << typeid(b).name() << " " << typeid(New_b).name() << endl;return 0;
}

在这里插入图片描述
注意 !:

  1. 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。

  2. 因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

2.2 auto使用细则

#include <iostream>
using namespace std;int main(){int x = 0;//1. auto 随便用,无限制auto a1 = x;auto a2 = &x;// 2.auto * 限定对象必须是地址auto* a3 = &x;// 3.auto & 限定对象必须是变量auto& a4 = x;//auto& a5 = &x; <- 会报错// 4.同一行声明多个变量时,这些变量必须是相同的类型//因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。auto a = 1, b = 2;//auto c = 3, d = 4.0; <- 会报错return 0;
}

3. 基于范围的for循环

int a[] = { 1,2,3,4,5 };for (int i : a)
{cout << i << endl;
}
//多这样用:
for (auto i : a)
{cout << i << endl;
}

i 是范围内用于迭代的变量,a 则表示被迭代的范围。

要对a数组修改,就起别名

int a[] = { 1,2,3,4,5 };
for (auto &i : a)
{i *= 2;cout << i << endl;
}

4. nullpter

在C语言中,我们给指针初始化时,常赋值为NULL:

void TestPtr()
{int* p1 = NULL;int* p2 = 0;
// ……
}

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

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

可以看到, NULL可能被定义为字面常量0,或者被定义为无类型指针(void * )的常量。 不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{cout << "f(int)" << endl;
}
void f(int*)
{cout << "f(int*)" << endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

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

在C++中可以改用 nullpter ,nullpter 直接是一个指针类型,可以避免以上相悖的情况。

注意!

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

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

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

相关文章

Vue input密码输入框自定义密码眼睛icon

我们用的饿了么UI组件库里,密码输入框的icon是固定不变的,如下所示: 点击"眼睛"这个icon不变,现在需求是UI给的设计稿里,密码输入框的"眼睛"有如下两种: 代码如下: <el-input:key="passwordType"ref="password"

重装系统前备份笔记

一、点查看自定义快捷键可以定义一些快速启动方式 然后用不习惯的快捷键也能在这里改 二、android studio 快捷键导出备份 导入方法&#xff1a; android studio &#xff0d;>file->import setting ->选择jar包即可 导出studio的设置方法&#xff1a; android …

假期别闲着:REST API实战演练之创建Rest API

1、创建实体类&#xff0c;模拟实体对象 创建一个类&#xff0c;模拟数据数据库来存储数据&#xff0c;这个类就叫Person。 其代码如下&#xff1a; package com.restful;public class Person {private String name;private String about;private int birthYear;public Perso…

【jQuery】jQuery框架

目录 1.jQuery基本用法 1.1选择器 1.2jQuery对象 1.3事件绑定 1.4链式编程 1.5过滤方法 1.6样式操纵 1.6属性操纵 1.7操作value 1.8查找方法 1.9类名操纵 1.10事件进阶 1.11触发事件 1.12window事件绑定 2.节点操作与动画 2.1获取位置 2.2滚动距离 2.3显示/隐…

LangChain-15 Manage Prompt Size 管理上下文大小,用Agent的方式询问问题,并去百科检索内容,总结后返回

背景描述 这一节内容比较复杂&#xff1a; 涉及到使用工具进行百科的检索&#xff08;有现成的插件&#xff09;有AgentExecutor来帮助我们执行后续由于上下文过大&#xff0c; 我们通过计算num_tokens&#xff0c;来控制我们的上下文 安装依赖 pip install --upgrade --qu…

「每日跟读」英语常用句型公式 第7篇

「每日跟读」英语常用句型公式 第7篇 1. He might as well ___ 其实可以___(也无妨) We might as well walk to school (我们其实可以走去学校) We might as well give up (我们其实可以放弃) You might as well go home (你其实可以回家) You might as well listen to h…

数据库设计说明书(Word模板)

2 数据库环境说明 3 数据库的命名规则 4 逻辑设计 5 物理设计 5.1 表汇总 5.2 表结构设计 6 数据规划 6.1 表空间设计 6.2 数据文件设计 6.3 表、索引分区设计 6.4 优化方法 7 安全性设计 7.1 防止用户直接操作数据库 7.2 用户帐号加密处理 7.3 角色与权限控制 8 数据库管理与维…

标准C库文件操作

open 系列API 和 fopen系列API的区别 1.来源: -open 是UNIX系统调用函数(包括LINUX系统)&#xff0c;返回的是文件描述符 -fopen是ANSIC标准的C语言库函数&#xff0c;在不同系统重调用不同内核的API 2.移植性: fopen 是C标准函数&#xff0c;具有良好的移植性&#xff1b; 而…

photomaker:customizing realistic human photos via stacked id embedding

PhotoMaker: 高效个性化定制人像照片文生图 - 知乎今天分享我们团队最新的工作PhotoMaker的技术细节。该工作开源5天Githubstar数已过6千次&#xff0c;已列入Github官方Trending榜第一位&#xff0c;PaperswithCode热度榜第一位&#xff0c;HuggingFace Spaces趋势榜第一位。项…

Vue2 —— 学习(四)

一、收集表单数据 &#xff08;一&#xff09;介绍 前面其实已经 学过了 v-model 双向绑定事件&#xff0c;能获取到表单中的内容到 vm 实例对象中 但是前面只是收集文本框&#xff0c;下面学习一下 各种类型表单数据收集 &#xff08;单/多 选&#xff0c;下拉框&#xff0…

关闭TED报ORA-28365: wallet is not open

关闭钱包报 实际状态是open状态&#xff1a; V$ENCRYPTION_WALLET.STATUS列如果不为CLOSED&#xff0c;重启后也不能是CLOSED&#xff0c;或者清理完成后&#xff0c;再次初始化报“Master Key已存在”错误。 获取UNDO表空间大小 SQL> show parameter undo_tablespace NA…

Elastic:加速生成式人工智能体验

作者&#xff1a;Matt Riley 搜索驱动的人工智能和开发人员工具专为速度和规模而打造。 在大型语言模型&#xff08;LLM&#xff09;和生成式 AI 的每日突破中&#xff0c;开发者站在了这场运动的最前沿&#xff0c;影响着它的方向和可能性。在这篇博客中&#xff0c;我将分享…

第十三篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python自动化操作PPT

传奇开心果博文系列 系列博文目录Python自动化办公库技术点案例示例系列 博文目录前言一、 Python自动化操作PPT能力介绍二、常用库介绍三、创建新PPT示例代码四、编辑现有PPT示例代码五、批量处理示例代码六、数据驱动生成示例代码七、合并与拆分示例代码八、母版和版式操作示…

词频统计程序

使用Hadoop MapReduce处理文本文件&#xff0c;Mapper负责将文本分割为单词&#xff0c;然后Reducer对每个单词进行计数&#xff0c;最后将结果写入输出文件。 // 定义WordCount公共类 public class WordCount {// 主入口方法&#xff0c;处理命令行参数public static void m…

计算机视觉技术:深度学习在美颜SDK中的应用探索

当下&#xff0c;计算机视觉技术在美颜领域的应用变得越来越重要。接下来&#xff0c;小编将讲解深度学习在美颜SDK中的应用&#xff0c;以及它如何改变我们对美颜技术的认识和期待。 一、美颜技术的发展 虽然美颜技术可以在一定程度上改善图像质量&#xff0c;但往往难以满足…

Vue - 4( 8000 字 Vue 入门级教程)

一&#xff1a; Vue 初阶 1.1 关于不同版本的 Vue Vue.js 有不同版本&#xff0c;如 vue.js 与 vue.runtime.xxx.js&#xff0c;这些版本主要针对不同的使用场景和需求进行了优化&#xff0c;区别主要体现在以下几个方面&#xff1a; 完整版 vs 运行时版&#xff1a; vue.js&…

大厂设计师倾心推荐的在线作图免费网站

在当今数字时代&#xff0c;绘画已经成为各行各业的必备技能。无论你是设计师、学生、创作者还是业余爱好者&#xff0c;免费的在线绘图软件都是发挥创造力和表达想法的理想选择。本文将介绍七款强大免费的在线绘图软件&#xff0c;让你轻松实现自己的创作梦想。你可以在不安装…

中间件漏洞攻防学习总结

前言 面试常问的一些中间件&#xff0c;学习总结一下。以下环境分别使用vulhub和vulfocus复现。 Apache apache 文件上传 (CVE-2017-15715) 描述: Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨…

UE5、CesiumForUnreal实现建筑白模生长动画效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体代码2.3 应用测试3.参考资料1.实现目标 在上篇文章加载本地建筑轮廓GeoJson数据生成建筑白模的基础上,本文通过材质“顶点偏移”实现建筑白模生长效果,GIF动图如下所示: 2.实现过程 常用的实现建筑生长效果的方式有两种,…

Unity 获取RenderTexture像素颜色值

拿来吧你~ &#x1f9aa;功能介绍&#x1f32d;Demo &#x1f9aa;功能介绍 &#x1f4a1;不通过Texture2D 而是通过ComputerShader 提取到RenderTexture的像素值&#xff0c;效率有提升哦&#xff01; &#x1f4a1;通过扩展方法调用&#xff0c;方便快捷&#xff1a;xxxRT.G…