如何在c ++中将使用malloc创建的数组声明为volatile

Mar*_*ark 15 c++ arrays malloc multithreading volatile

我认为以下将给我10个不稳定的整数

volatile int foo[10];
Run Code Online (Sandbox Code Playgroud)

但是,我认为以下内容不会做同样的事情.

volatile int* foo;
foo = malloc(sizeof(int)*10);
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我,以及如何使用malloc获得易失性的项目数组.

谢谢.

ton*_*ony 13

int volatile * foo;
Run Code Online (Sandbox Code Playgroud)

从右到左阅读"foo是指向volatile int的指针"

所以无论你通过foo访问什么int,int都将是volatile.

PS

int * volatile foo; // "foo is a volatile pointer to an int"
Run Code Online (Sandbox Code Playgroud)

==

volatile int * foo; // foo is a pointer to an int, volatile
Run Code Online (Sandbox Code Playgroud)

意思是foo是不稳定的.第二种情况实际上只是一般的从右到左规则的剩余部分.要吸取的教训是养成使用习惯

char const * foo;
Run Code Online (Sandbox Code Playgroud)

而不是更常见的

const char * foo;
Run Code Online (Sandbox Code Playgroud)

如果你想要更复杂的东西,比如"指向函数返回指向int的指针",那就没有任何意义了.

PS,这是一个巨大的(和我添加答案的主要原因):

我注意到你将"多线程"作为标记包含在内.你是否意识到volatile在多线程方面几乎没有什么好处?

  • 在线程之间共享状态变量时必须使用volatile; 特别是对于使用忙等待的并发无锁算法.例如,线程1将旋转此指令:while(barrier); 直到线程2设置barrier = false.如果未使用volatile,那么如果编译器决定从其本地寄存器而不是内存中读取屏障值,则代码可能会死锁. (4认同)

小智 6

volatile int* foo;
Run Code Online (Sandbox Code Playgroud)

是要走的路.该挥发性类型限定符作品就像常量类型限定符.如果你想要一个指向常量数组的指针,你会写:

const int* foo;
Run Code Online (Sandbox Code Playgroud)

int* const foo;
Run Code Online (Sandbox Code Playgroud)

是一个指向整数的常量指针,该整数本身可以更改.volatile以同样的方式工作.