Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Volatile不会阻止对变量进行优化_C_Memory_Volatile - Fatal编程技术网

C Volatile不会阻止对变量进行优化

C Volatile不会阻止对变量进行优化,c,memory,volatile,C,Memory,Volatile,正如我所知,“volatile”关键字用于防止编译器优化未使用的变量。我正在使用STM32板,我声明并初始化一个变量,如下所示: volatile uint32_t errorCallbackCounter = 24 ; 永远不要再使用它 调试时,未看到此变量。我正在使用STMStudio(一个实时变量观察器)进行检查,当我想要导入变量时,errorCallbackCounter的地址被视为0x0 但当我在任何地方使用它时,它就变得可见了 所以volatile关键字没有发挥作用,或者更可能的是

正如我所知,“volatile”关键字用于防止编译器优化未使用的变量。我正在使用STM32板,我声明并初始化一个变量,如下所示:

volatile uint32_t errorCallbackCounter = 24 ;
永远不要再使用它

调试时,未看到此变量。我正在使用STMStudio(一个实时变量观察器)进行检查,当我想要导入变量时,
errorCallbackCounter
的地址被视为0x0

但当我在任何地方使用它时,它就变得可见了

所以volatile关键字没有发挥作用,或者更可能的是,我知道它有问题


提前感谢。

volatile表示系统将在每次访问该变量时从内存中加载该变量。 不允许编译器将数据直接存储到寄存器中

volatile关键字防止编译器对涉及volatile对象的代码执行优化,从而确保每个volatile变量赋值和读取都有相应的内存访问。如果没有volatile关键字,编译器知道在每次使用时不需要从内存中重新读取变量,因为不应该有任何其他线程或进程对其内存位置的写入


volatile
表示每次访问该变量时,系统都会从内存中加载该变量。 不允许编译器将数据直接存储到寄存器中

volatile关键字防止编译器对涉及volatile对象的代码执行优化,从而确保每个volatile变量赋值和读取都有相应的内存访问。如果没有volatile关键字,编译器知道在每次使用时不需要从内存中重新读取变量,因为不应该有任何其他线程或进程对其内存位置的写入


链接器可以删除从未使用过的变量

volatile
关键字影响访问变量的代码,防止编译器重新排列或删除访问。上面这一行是一个带有初始值设定项的变量定义,它不算作访问,而是在
main()
开始之前安排好的。但是如果它没有被可访问的程序代码引用,或者根本没有被访问,那么链接器认为删除它是安全的,没有人会注意到

但是,您可以使用标记将变量标记为“无论如何都需要”


放在定义的末尾。这适用于
gcc
,其他编译器可能有另一个指令。还有一个链接器选项,我现在想不起来它可以在可执行文件中包含所有未使用的数据部分。

链接器可以删除从未使用过的变量

volatile
关键字影响访问变量的代码,防止编译器重新排列或删除访问。上面这一行是一个带有初始值设定项的变量定义,它不算作访问,而是在
main()
开始之前安排好的。但是如果它没有被可访问的程序代码引用,或者根本没有被访问,那么链接器认为删除它是安全的,没有人会注意到

但是,您可以使用标记将变量标记为“无论如何都需要”


放在定义的末尾。这适用于
gcc
,其他编译器可能有另一个指令。还有一个链接器选项,我现在想不起来,它可以在可执行文件中包含所有未使用的数据部分。

嘿,谢谢你的回答,所以我对volatile的理解有点错误。那么,你知道我的问题有什么解决办法吗?或者你知道为什么吗?这是其他优化问题吗?我不知道你为什么想要一个从未使用过的变量,但我认为如果你在代码中至少读一次,编译器就会创建它。我不需要它做任何特定的用途,我只是好奇而已。因此,
volatile
将在这样的场景中产生不同,
inta=5;而(a){}
如果进行优化,可能会导致绝对无限循环。另一方面,如果
volatile int a=5,处理器将始终检查变量
a
的值;而(a){}
。我现在说得对吗?谢谢。@muyustan是的,第一个将永远等待,后一个将一直等待,直到
a
以某种方式变为
0
,例如,被信号或中断处理程序更改。嘿,谢谢你的回答,所以我对volatile的理解有点错误。那么,你知道我的问题有什么解决办法吗?或者你知道为什么吗?这是其他优化问题吗?我不知道你为什么想要一个从未使用过的变量,但我认为如果你在代码中至少读一次,编译器就会创建它。我不需要它做任何特定的用途,我只是好奇而已。因此,
volatile
将在这样的场景中产生不同,
inta=5;而(a){}
如果进行优化,可能会导致绝对无限循环。另一方面,如果
volatile int a=5,处理器将始终检查变量
a
的值;而(a){}
。我现在说得对吗?谢谢。@muyustan是的,第一个将永远等待,后一个将一直等待,直到
a
以某种方式变为
0
,例如被信号或中断处理程序更改。谢谢,这很好地回答了我的问题。如果你有时间的话,请你看看上面答案评论部分的我的例子(以检查我是否理解正确)。谢谢,这很好地回答了我的问题。如果你有时间的话,你可以看看我在上面答案的评论部分的例子(以检查我是否得到了正确的答案)。
__attribute__((used))