首页 > 其他分享 >内联函数 auto 基于范围for循环 空指针nullptr

内联函数 auto 基于范围for循环 空指针nullptr

时间:2024-03-31 19:30:58浏览次数:19  
标签:函数 int auto void nullptr 内联 array

内联函数(C98)

1.含义

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。(官方术语)

C++内联函数和C语言的宏函数很像,都是在编译时调用的地方展开,函数调用要开辟空间消耗栈要花蛮多时间,而内联函数不要开辟和消耗栈,以空间换时间的处理方式。(my)

2.使用 

在函数前加一个inline (内联的英文)

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

3.注意:因为如果这个函数调用1000次,而函数内容有20个指令,如果用内联函数展开就有20000个指令,而函数调用的话只要1000 + 20个指令;反而没怎么优化。

 所以内联函数只是建议编译器这样处理,如果函数指令较多或者有递归循环等,编译器会自己比较选择。所以内联函数一般使用于小于20行的函数。

b.inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会 找不到。(这个好容易忘记,因为我写的时候已经忘记了) 

如图下   分离成 3个文件。                                     

// F.h
 #include <iostream>
 using namespace std;
 
inline void f(int i);
 

// F.cpp
 #include "F.h"
 void f(int i)
 {
    cout << i << endl;
 }
 

// main.cpp
 #include "F.h"
 int main()
 {
    f(10);
    return 0;
 }
//无法解析的外部符号 报错报错

无法解析外部符号是因为在头文件F.h的inline void f(int i)展开后自动销毁了,导致在main中没有声明,所以报错。

4.宏的缺点(为什么不用宏呢?)

1.不方便调试宏。(因为预编译阶段进行了替换)

2.导致代码可读性差,可维护性差,容易误用。

3.没有类型安全的检查 。

auto(C11)

1.含义

auto有个意思是自动和它的作用一样,auto a = b;自动转换成右边b的类型

2.注意点

a.  auto不能作为函数的参数

b. auto不能直接用来声明数组

void TestAuto()
{
	int a[] = { 1,2,3 };
	auto b[] = { 4,5,6 };
}//报错 报错

基于范围的for循环(C11)

用C98的普通for,实现一个让数组内容×2,然后在打印出来。需要如下步骤。

void TestFor()
 {
    int array[] = { 1, 2, 3, 4, 5 };
    for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
        array[i] *= 2;
    
    for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
        cout << *p << endl;
 }

C11的范围for(和其他循环一样,可以用break停止,也可以用continue)

范围for的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围。

范围for步骤如下

void TestFor()
 {
    int array[] = { 1, 2, 3, 4, 5 };
    for(auto& e : array)
        e *= 2;
    
    for(auto e : array)
        cout << e << " ";
    
 }

相当于一直循环进行这个过程auto&e = array;e*=2;直至array没有元素了自动停止,非常简洁明了。(&是引用符号我空间有详细讲解)

ps:注意数组传参给函数时传的是首元素地址,所以array在函数中会退化成指针,范围性就失去了,故下列代码会报错。所以每次数组传参时要带上元素个数。

数组是典型的begin函数,而指针不是因为没有范围性。数组传参后退化成指针所以报错。

指针空值nullptr(C11)

在C语言中空指针是NULL,这个NULL是用宏定义的,在<stdio.h>中有#define NULL 0

所以在计算机编译时会用0将NULL换掉,而不是用(void*)0替代NULL;看这段代码理解深些。(利用了函数重载)

这就是为什么f(NULL)和f(0)的结果是一样,而nullptr解决了这个问题。类型对于重载函数来说非常重要。

注:

1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。

2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

3.为了提高代码的健壮性和安全性,建议以后都用nullptr。

ps:让我们一起学习C++知识叭,如果有错误,可以指点指点我噢。一起进步!

标签:函数,int,auto,void,nullptr,内联,array
From: https://blog.csdn.net/rwh04160416/article/details/137064181

相关文章

  • SpringBoot集成Junit单元测试找不到bean报错:expected at least 1 bean which qualifie
    发生缘由调用封装的MinIOstarter运行环境电脑系统版本:Windows1064bitIdea:2023.2(UltimateEdition)Maven:apache-maven-3.6.0Docker:Dockerversion26.0.0,build2ae903eMinIO:加载本地镜像,不清楚版本号jdk版本:jdk-8spring.boot.version:2.3.9.RELEASEminio依赖:7.1.......
  • 涛哥聊Python | auto-sklearn,一个非常好用的 Python 库!
    本文来源公众号“涛哥聊Python”,仅用于学术分享,侵权删,干货满满。原文链接:auto-sklearn,一个非常好用的Python库!大家好,今天为大家分享一个非常好用的Python库-auto-sklearn。Github地址:https://github.com/automl/auto-sklearn随着机器学习技术的快速发展,越来越多的组......
  • pyautocad 命令行方式操作 CAD
    测试代码importnumpyasnpfrompyautocadimportAutocad,aDouble,APointdef计算距离():acad=Autocad(create_if_not_exists=True)acad.prompt("计算2点间距离")acad.prompt("请选择第1个点")第1个点=acad.doc.Utility.GetPoint()x1,y1......
  • auto-install-peers=true strict-peer-dependencies=false 这两个配置的作用是什么
    auto-install-peers=true和strict-peer-dependencies=false是与软件包管理器相关的配置选项,它们通常用于控制如何处理项目的依赖关系,特别是涉及到“peerdependencies”的情况。虽然您没有指明具体的包管理器(如npm、yarn等),但这些配置项的概念在许多包管理器中是通用的。下面是......
  • Vim插件之auto-pairs
     本文结构:a、简介b、安装auto-pairsc、使用d、注意事项a、jiangmiao/auto-pairs:这个插件可以自动补全括号、引号等符号,提高编程效率。要安装和使用插件,通常需要一个插件管理器,如Vundle或Volt。这些管理器可以帮助你方便地安装、更新和卸载插件。安装插件后,你可能还需要在......
  • 如何用autosar工具链搭建代码 点亮一个小灯
    一、搭建Mcal用EB软件1、新建工程2、配置Resource3、配置MCU4、配置Port5、配置Dio6、输出Arxml二、DavinciConfiguration配置前准备1、新建工程2、导入通信文件3、导入Mcal文件三、配置OS1、顺手配置Det2、配置EcuC3、配置OS四、解决ERROR1、修改CAN波特......
  • AUTOSAR MCAL基础配置(实操)
    一、用EB配置工程操作流程:1、在EBTresos配置工具中新建MCAL配置工程,添加MCU和PORT模块,分别对其进行配置。2、对MCU时钟进行配置,时钟源为外部8M晶振,经过40倍倍频,再经过二分频得到160MHz的PLL输出时钟。最终得到80M内核时钟,40M总线时钟,20M的flash时钟3、在EBTresos配置......
  • P8312 [COCI2021-2022#4] Autobus floyd最短路
    [P8312COCI2021-2022#4]Autobus-洛谷|计算机科学教育新生态(luogu.com.cn)思路:nnn数据范围很小可以用Floyd算法。注意:最多坐......
  • Spring Boot整合MyBatis-Plus,并通过AutoGenerator生成项目骨架代码
    作为一名Java后端开发,日常工作中免不了要生成数据库表对应的持久化对象PO,操作数据库的接口DAO,以及CRUD的XML,也就是mapper。MybatisGenerator是MyBatis官方提供的一个代码生成工具,完全可以胜任这个工作,不过最近在开发项目的时候试用了一下MyBatis-Plus官方提供......
  • Channel-Wise Autoregressive Entropy Models For Learned Image Compression
    目录简介创新点模型框架信道条件熵模型实验&结果简介熵约束自动编码器的熵模型同时使用前向适应和后向适应。前向自适应利用边信息,可以被有效加入到深度网络中。后向自适应通常基于每个符号的因果上下文进行预测,这需要串行处理,这妨碍了GPU/TPU的有效利用。创新点本文引......