【C++】内联函数与快速读入read函数(整型)

这篇具有很好参考价值的文章主要介绍了【C++】内联函数与快速读入read函数(整型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在学习C++的过程中,在很多的题解中都发现了利用read来实现快速读入的功能,今天,我们就来学习一下快速读入这个函数,并顺带着学习一下内联函数

内联函数

在学习read函数之前,我们先来学习一下内联函数

引入

我们都知道,函数在分类上可以分为主调函数和被调函数,main函数就是主调函数,是调用其他函数的函数,在C程序中mian函数就是主调函数
而像bubble_sort这些其他的函数就称为被调函数,他们都被主调函数调用

在程序执行的时候,都是先执行主调函数再执行被调函数,而当程序在执行被调函数,主调函数是停止的、不执行的,(此处可以借助调试时,按ctrl + fn + F11进入被调函数内部 来进行理解),当执行完被调函数,程序再继续执行刚才主调函数中停止时后面的部分,

我们都知道,函数调用是需要做一些准备的,
首先,程序要在栈中开辟出足够大的空间,先将实参、局部变量、返回地址以及若干寄存器都存储在其中,
然后,才能执行函数体中的代码
最后,函数体中的代码执行完毕后还要清理现场,也就是释放内存将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。

此处可以参考我的另一篇文章函数栈帧的创建和销毁,可能会有助于理解函数调用的过程

经过上面的介绍,相信大家可以理解一件事:
函数体很庞大时,其准备所需的时间就可以忽略不计
而当函数体只有一两条语句时,其准备所需的时间就不可忽略,一旦这个简单的函数要调用很多次,那在时间上和空间上都是一种浪费

此时,人们就想,能不能设计一种函数,当它结束调用时不释放它在内存中开辟的空间,此时,就出现了内联函数

定义

为了消除函数调用的时空开销,也就是更快速
C++ 中提供一种提高效率的方法,即在编译时将函数调用处用函数体替换
类似于C语言中的宏展开。
这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数

使用

下面,通过一个简单的例子来介绍内敛函数如何使用

例子

使用内联函数创建一个函数,功能是交换两个数

#include<iostream>

using namespace std;

inline void swap(int* a, int* b)
{
	int tmp = *b;
	*b = *a;
	*a = tmp;
}

int main()
{
	int a = 1;
	int b = 2;
	cout << a << endl << b << endl;
	swap(&a, &b);
	cout << a << endl << b << endl;

	return 0;
}

使用内联函数,需要在函数定义的开头使用inline关键字

注意

函数声明处写inline是无意义的,编译器会自动忽略掉他

内联函数的使用情况

因为在函数调用完成后,不会销毁它在内存中开辟的空间
所以,实际上编译后的程序中是存在着多份相同的内容拷贝

所以,当内联函数的函数体很大时,编译后的程序也非常大
所以再次强调,一般只将那些短小的、频繁调用的函数声明为内联函数

内联函数与宏定义

宏定义的函数不仅存在运算优先级的问题,并且也不可调试

相较于宏定义的直接替换,内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作的类的数据成员,所以应该尽量使用内联函数来取代宏代码

read函数

学习完了内联函数,接下来我们来学习快速读入:read函数

基本思路

读取字符

既然是读取数据,并且是一个一个的读取,那么我们肯定会用到getchar来读取字符

设置条件

其次,我们对于要输入的数据肯定是有一定的要求的,不能什么数据都传输进来,
所以我们就要都传入的数据进行判断,看其是否满足我们的条件

代码实现

下面,我们提供两种实现方法

简单版本

inline long long read()
{
	char cc = getchar();//读取第一个字符
	long long f = 1;//f用于判断符号正负
	long long ans = 0;//ans用于控制数字

	while (cc < '0' || cc>'9')
	{
		if (cc == '-')
		{
			f = -1;
		}
		cc = getchar();
	}

	while (cc >= '0' && cc <= '9')//遇到空格,则这个整形数据读取结束
	{
		ans = (ans * 10) + (cc - '0');
		cc = getchar();
	}

	return f * ans;
}

优化版本

当然,我们也可以通过位运算来优化上面这个解法,毕竟而我们都知道位运算比乘除法的运行速率要快

inline long long read()
{
	char cc = getchar();
	long long f = 1;
	long long ans = 0;
	while (cc < '0' || cc>'9')
	{
		if (cc == '-')
		{
			f = -1;
		}
		cc = getchar();
	}

	while (cc >= '0' && cc <= '9')
	{
		ans = (ans << 1) + (ans << 3) + (cc - '0');//向右移动一位是乘以2
		cc = getchar();
	}

	return f * ans;
}

练习题

下面,还是给出一道练习题,方便大家理解

题目:A+B problem

题目描述:输入一个正整数n,表示有n个数,接下来再输入n个数。计算它们的和。

样例输入:

20 233 222 2334 123 654 2345 235 2345 321 357 123 45 65 346 76 456 778
-123 -20 -1000

样例输出:

9915

示例代码

#include<cstdio>
#include<iostream>

using namespace std;

inline long long read()
{
	char cc = getchar();
	long long f = 1;
	long long ans = 0;
	while (cc < '0' || cc>'9')
	{
		if (cc == '-')
		{
			f = -1;
		}
		cc = getchar();
	}

	while (cc >= '0' && cc <= '9')
	{
		ans = (ans << 1) + (ans << 3) + (cc - '0');
		cc = getchar();
	}

	return f * ans;
}

int main()
{
	long long ans = 0;
	int n = read();
	int a = 0;
	for (int i = 0; i < n; i++)
	{
		a = read();
		ans += a;
	}
	cout << ans << endl;

	return 0;
}

结语

好的,关于内联函数和read函数的介绍和学习到这里就结束了,希望对你有帮助,我们下篇文章见~文章来源地址https://www.toymoban.com/news/detail-689303.html

到了这里,关于【C++】内联函数与快速读入read函数(整型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】:内联函数

    在c语言中,如果一个函数较短并且会被重复使用,那么我们就可以把该函数换成一个宏函数。 贴个小知识,宏函数有许多的坑也是面试官喜欢考的点,如果对行函数不太了解可以看看这篇关于宏的部分传送门 宏函数的优点:不会建立栈帧,提高使用效率。 宏函数的缺点:复

    2023年04月25日
    浏览(33)
  • 【C++】内联函数 ( 概念简介 )

    \\\" 内联函数 \\\" 是 C++ 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率 ; 在 C++ 中 , 定义常量 可以替换 C 语言中的 宏定义 使用 常量 可以 替代 宏定义 ; 宏定义分为两种 , 一种是 宏常数 , 另外一种是 宏代码片段 ; C++ 中使用 常量 替代 宏常数 ; C++ 中用于 替代 宏代码片

    2024年02月10日
    浏览(33)
  • 【C++】内联函数

    在C语言中,我们学习过宏的用法。宏通常被用于 进行简单的文本替换 来执行一系列的操作,比如一些简单的运算。使用宏可以 避免函数调用时建立栈帧的开销 ,提高程序的性能。我们首先来写一个实现加法功能的宏: 这个宏完美实现了我们的加法需求,但在定义宏时需要

    2024年01月18日
    浏览(35)
  • C++内联函数详解

    目录 如何定义内联函数? 内联函数的优势 内联函数的缺点 内联函数的使用场景 示例代码 总结 在C++中,内联函数是一种特殊的函数,它的作用是在程序编译时将函数的代码直接嵌入到调用该函数的代码中,从而避免了函数调用的开销。这种方式可以提高程序的执行效率,适

    2023年04月20日
    浏览(37)
  • 【C++入门】内联函数

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C++之路】 内联函数概念: 内联函数就是以inline修饰的函数叫做内联函数,编译时会在调用内联函数的地方展开,没有函数调用占用建立栈帧的开销。 我们知道函数的

    2024年02月01日
    浏览(42)
  • 【C++内联函数】

    假设有这样的一个场景,有一个代码量不足三行的函数被调用了一万次,现在让你做优化,你会怎么考虑优化? 我们都知道函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能

    2023年04月26日
    浏览(74)
  • 『C++成长记』C++入门——内联函数

     🔥 博客主页: 小王又困了 📚 系列专栏: C++ 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、内联函数 📒1.1内联函数的概念 📒1.2内联函数的特征 二、auto 📒2.1auto简介 📒2.2auto使用规则 📒2.3auto无法使用的场景 三、基于范围的for循

    2024年02月05日
    浏览(43)
  • 【C++】初阶 --- 内联函数(inline)

    🥰 用C语言先来实现普通的Add函数看一下 👇 转到反汇编来看一下: 可以看到,编译器为了实现一个简单的相加函数,Add函数体内需要执行的汇编指令要很多,而且为了调用函数还要执行指令跳转 (并且要在栈区上为函数开辟栈帧空间) ,如果 Add函数被重复大量地使用,则会

    2024年02月14日
    浏览(36)
  • 【C++入门】内联函数的秘密

    inline 修饰的函数叫内联函数,编译后会在调用内联函数的地方展开,没有调用函数的开销,可以提高程序运行的效率。 例子: 但是 inline 只是给编译器的一个建议,编译器自己会决定内联函数是否在调用处展开。 内联函数展开是一种空间换时间的做法,可能会造成代码膨胀

    2024年02月12日
    浏览(39)
  • C++:命名空间,缺省参数,函数重载,引用,内联函数

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++知识总结,我们来认识命名空间,缺省参数,函数重载,引用,内联函数。 那么在介绍命名空间时,我们先用C++的方式打印\\\"hello world\\\"。 其中,using namespace std; 就是一种命名空间的使用。 在

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包