欢迎光临散文网 会员登陆 & 注册

【C语言】类型限定符extern, const, Volatile, register

2023-02-27 16:24 作者:李桥桉  | 我要投稿

1、extern:

当我们在编译器中试图运行以下代码,系统会报错。

extern示例代码
报错内容

错误原因是“无法解析外部符号_a”.系统认为变量a是没有开辟内存空间的,不能进行存储。


所以,extern声明有a变量,但不是定义变量a,不会为变量a开辟存储空间。


2、const:

如下代码,若先定义一个不可变的整型变量a并赋值为10,则再次给a赋新值时,系统会在变量a下面标红,鼠标放在标红处会提示出错原因(如下图)。

const示例代码

强行运行以上代码后

报错内容

3、Volatile:

(1)①先定义一个普通的整型变量 a,然后分别进行3次赋值。众所周知,前两次赋值会被最后一次赋值覆盖掉,所以前两次的赋值已经无意义了,可以被优化掉。

代码

②通过编译

编译过程

③生成汇编语言。通过查看汇编结果,可以看出3次赋值均被优化掉了,为什么最后一次赋值也被优化了呢?这是因为,我们的C语言代码对变量a进行三次赋值后,并没有对a进行调用或后续其他任何操作,系统认为这三句都是无实际意义的,就被优化掉了哈哈哈。

编译后的汇编代码

(2)① 给a赋值的这3步,不想被优化可以使用volatile。在整型int 前加volatile即可。

volatile示例代码

②带优化选项的编译过程

编译

③生成汇编语言。给a赋值的三步语句还在,并没有被优化掉。其他代码被正常简化了。

汇编代码

4、register:

我们定义一个变量,想用更快的方式访问这个变量,就可以用register。

cpu访问内存需要经过总线,时间比较长。定义了一个变量,这个变量就使用寄存器,不经过内存也不需要访问总线,那么访问速度自然就很快。

(1)①一般的不加register的变量类型,是往内存栈(%rsp)中去赋值。

C代码

②经过编译成汇编代码,语句如下。

编译成汇编代码

(1)①加register的变量类型,是往寄存器(%eax)中去赋值。

C代码

②经过编译成汇编代码,语句如下。

编译成汇编代码

寄存器的名字,了解即可。

寄存器的名字

寄存器、缓存、内存三者关系


5、总结

关注公粽号@李桥桉,可免费获取配套《C语言讲义》,知识点超全超系统哦!非常适合C语言入门及、进阶选手学习哦。

【C语言】类型限定符extern, const, Volatile, register的评论 (共 条)

分享到微博请遵守国家法律