关键字register和static

register

其实,CPU主要是负责进行计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到CPU内,那么也就需要CPU具有一定的数据临时存储能力。注意:CPU并不是当前要计算了,才把特定数据读取到CPU里面,那样太慢了。

所以现代CPU内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存。

存储金字塔

image-20220526192221068

距离CPU越近的存储硬件,速度越快。

寄存器的认识

关于硬件细节,并不是这里主要说明的。现在只需了解CPU内集成了一组存储硬件即可,这组硬件叫做寄存器。

寄存器存在的本质

在硬件层面上,提高计算机的运算效率。因为不需要频繁从内存里读取数据啦。

register修饰变量

作用:尽量将所修饰的变量,放入CPU寄存器中,从而达到提高效率的目的

那么什么样的变量,可以采用register呢?
    
1. 局部变量(全局变量会导致CPU寄存器被长时间占用)
2. 不会被写入的(写入就需要写回内存,后续还要读取检测的话,register也就没有意义了)
3. 高频被读取的(提高效率所在)
4. 如果要使用,请不要大量使用,因为寄存器数量有限
5. register修饰的变量不能取地址(因为变量已经放在寄存器中了,而地址是内存相关的概念)
//demo
#include <stdio.h>
int main()
{
    register int a = 10;
    printf("%p\n", &a);
    //vs2019编译器报错:error c2103: 寄存器变量上的“&”
	return 0;    
}
该关键字,不用管,只需了解,因为现在的编译器非常智能,能够比人进行更好的代码优化。
早期编译器需要人为指定register,来进行手动优化,现在不需要了。

static

认识多文件

image-20220526221328109

程序虽然运行过去了(因为在编译时,会把函数当作一个符号,而当最终链接在一起时,main.c还是会找到test.c中的show的),但我们正常情况下我们还是需要在main.c中声明一下的。这时我们就会知道,想使用其它源文件的内容时,最好是需要声明的,而**假设只使用源文件,并且源文件很多时,组织项目结构的时候,项目越大越复杂的时候,维护成本会变得越来越高!**而这时就诞生了.h头文件,有了头文件,我们把所有的声明都放进去,每个源文件都只需包含一下头文件名就可以。头文件在组织项目结构的时候,会减少大型项目的维护成本问题。

而.h基本都是要被多个源文件包含的,可能就有一个问题,头文件被重复包含的问题,这会使得程序在运行的时候会多次调用被包含的内容,导致性能下降。而要解决这个问题,这里先谈一种方法,在头文件的一开始写入#pragma once

//test.h头文件中一般包含的内容
#pragma once
C头文件
所有的变量的声明
所有的函数的声明
#define,typedef,struct...

全局变量和函数的两个结论

1. 全局变量,是可以跨文件的,被访问的。
2. 全局函数,是可以跨文件的,被访问的。
为什么呢?
因为有一定规模的项目,一定是多文件的,多个文件之间,后续一定要进行数据“交互”,如果不能跨文件,“交互”成本较高。

static的作用

修饰全局变量和函数时

1. 修饰全局变量,该全局变量只能在本文件内被使用,不能被外部其它文件直接访问。(缩小了作用域,生命周期不变)
2. 修饰函数,该函数只能在本文件内被使用,不能被外部其它文件直接访问。(缩小了作用域,生命周期不变)
为什么呢?
因为当我们不想使过多的或者特定的函数、全局变量暴露给用户时需要一定的手段,而手段就是static
static便于使项目更容易维护,提供了安全保证

既然上面说到了不能直接访问,那是不是可以间接访问呢?答案是:可以的。(通过别的接口调用)

image-20220526202607910

image-20220526202538846

image-20220526202405022

修饰局部变量时

修饰局部变量,使得局部变量的声明周期变长为全局变量的周期(作用域不变)

image-20220526220104730

可以看到效果,这是因为变量i的声明周期变长为全局周期了,在出test()时,变量i不会销毁

这实际上是因为static改变了变量i的开辟内存的位置

局部变量是创建在栈上的,而栈上的变量是具有临时性的,局部变量在创建的时候入栈,在销毁的时候出栈

周期变长为全局周期了,在出test()时,变量i不会销毁

这实际上是因为static改变了变量i的开辟内存的位置

局部变量是创建在栈上的,而栈上的变量是具有临时性的,局部变量在创建的时候入栈,在销毁的时候出栈

而static局部变量是创建在全局数据区的,该区域上的变量在整个“进程”运行生命周期内,都是有效的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云朵c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值