C和C++中的易失性数组

use*_*501 24 c c++ arrays embedded volatile

在C中使用volatile关键字来防止编译器对变量执行某些优化以及其他细微更改.

例如;

volatile int my_int = 0;
Run Code Online (Sandbox Code Playgroud)

创建一个整数.在某些情况下,它可能会阻止以下优化:

while(my_int == 0); // Loop until my_int != 0
Run Code Online (Sandbox Code Playgroud)

优化到:

while(1); // Loop infinity.
Run Code Online (Sandbox Code Playgroud)

这对于包括嵌入式系统中经常遇到的情况很有用,例如可以通过中断函数调用对变量进行修改的情况.还有许多其他这种技术有用的例子.my_int可以是由这种功能修改的标志.(这只是一个玩具模型.)

但是,请考虑函数修改的数据是数组的情况.数据可以由指针指向.

unsigned char* my_data = new unsigned char[256];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,考虑到是my_data在这个问题上的该特定情况的全局变量[1],volatile关键字冗余的,或者它仍需要?

[1]可能无关紧要.

如果答案是需要volatile关键字,那么使用正确的语法是什么?

例如,volatile unsigned char* my_data假设声明指针本身是易失性的,而不是它指向的数据.

最后,C和C++的使用有区别吗?

Fil*_*ves 30

是的,volatile是必需的,正确的声明是:

volatile unsigned char *my_data;
Run Code Online (Sandbox Code Playgroud)

这声明my_data是指向volatile unsigned char的指针.

要使指针本身易变,你需要这样做:

unsigned char *volatile my_data;
Run Code Online (Sandbox Code Playgroud)

当然,指针和指向数据都可能是易失性的:

volatile unsigned char *volatile my_data;
Run Code Online (Sandbox Code Playgroud)

C和C++之间没有区别.