volatile到底有什么用?和regist有什么区别?
发布日期:2021-06-30 10:11:51 浏览次数:3 分类:技术文章

本文共 870 字,大约阅读时间需要 2 分钟。

volatile

也是个单词嘛,解释是易变的,不稳定的,也就是定义为volatile的变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。即
优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
具体例子:
1)并行设备的硬件寄存器(如状态寄存器)
2)一种中断服务子程序中会访问到底额非自动变量。
3)多线程应用中被几个任务共享的变量。
以上都是在嵌入式工程师的最基本的问题,在和硬件,中断打交道的,不懂volatile就是灾难。
以下是关于volatile的小问题:
1). 一个参数既可以是 const 还可以是 volatile 吗?例如const volatile int a;解释为什么。
2). 一个指针可以是 volatile 吗?解释为什么。
1)
如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了。
2)可以,一个例子是当一个中服务子程序修该一个指向一个 buffer 的指针时。

register

在函数内部定义变量时,默认是auto类型,即分配给变量内存。如果定义一个变量用register关键字,那么编译器尽可能把变量存放在CPU内部寄存器中,这样就不必通过内存寻址来访问变量,提高访问效率。
当然使用register来修饰的变量必须是可以存放在寄存器栈中的。这么说寄存器和栈是不对的,学过就知道了,寄存器是CPU的组成部分。他们告诉的栈在内存的什么地方,也就是地址。
正确地说,register修饰的变量必须是CPU可以接受的类型,像全局静态变量是不行的。
而且也不能过多的定义变量,因为存放在寄存器的数量是有限的啦

不同

volatile是易变的,所以不允许被放入寄存器中,每次使用都要重新读取,但register要尽量放在寄存器,提高效率,目前好多编译器的优化都比较好,使用register的必要性不高。

转载地址:https://islet.blog.csdn.net/article/details/75734347 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++各种指针声明
下一篇:程序的内存分配到几个部分?

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月29日 05时12分14秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章