大家好,欢迎来到IT知识分享网。
volatile
也是个单词嘛,解释是易变的,不稳定的,也就是定义为volatile的变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。即
优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
具体例子:
1)并行设备的硬件寄存器(如状态寄存器)
1)并行设备的硬件寄存器(如状态寄存器)
2)一种中断服务子程序中会访问到底额非自动变量。
3)多线程应用中被几个任务共享的变量。
以上都是在嵌入式工程师的最基本的问题,在和硬件,中断打交道的,不懂volatile就是灾难。
以下是关于volatile的小问题:
1). 一个参数既可以是 const 还可以是 volatile 吗?例如const volatile int a;解释为什么。
2). 一个指针可以是 volatile 吗?解释为什么。
2). 一个指针可以是 volatile 吗?解释为什么。
1)
如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了。
如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了。
2)可以,一个例子是当一个中服务子程序修该一个指向一个 buffer 的指针时。
register
在函数内部定义变量时,默认是auto类型,即分配给变量内存。如果定义一个变量用register关键字,那么编译器尽可能把变量存放在CPU内部寄存器中,这样就不必通过内存寻址来访问变量,提高访问效率。
当然使用register来修饰的变量必须是可以存放在寄存器栈中的。这么说寄存器和栈是不对的,学过汇编语言就知道了,寄存器是CPU的组成部分。他们告诉CPU线程的栈在内存的什么地方,也就是地址。
正确地说,register修饰的变量必须是CPU可以接受的类型,像全局静态变量是不行的。
而且也不能过多的定义变量,因为存放在寄存器的数量是有限的啦
不同
volatile是易变的,所以不允许被放入寄存器中,每次使用都要重新读取,但register要尽量放在寄存器,提高效率,目前好多编译器的优化都比较好,使用register的必要性不高。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/141677.html