2009-06-11 28 views

回答

25

完全一样非struct字段:

#include <stdio.h> 
int main (int c, char *v[]) { 
    struct _a { 
     int a1; 
     volatile int a2; 
     int a3; 
    } a; 
    a.a1 = 1; 
    a.a2 = 2; 
    a.a3 = 3; 
    return 0; 
} 

可以通过使用"volatile struct _a {...}"标记整个struct挥发性但上述方法是用于各个字段。

9

应该是相当直截了当根据this文章:

最后,如果你申请挥发到 结构或联合的全部内容的结构/联合的 是挥发性。如果 您不想要这种行为,那么您可以将 将volatile限定符应用于 结构/联合的 个别成员。

1

只是关于C/C++ volatile关键字的警告。

除非你知道你在做什么,你不应该使用它。

C/C++挥发性!=的Java/C#挥发性

震荡线程代码不会帮助,除非你真的知道自己在做什么,你需要使用的C++ 0x原子模板(或类似的东西)。

我唯一不得不使用volatile的是控制硬件寄存器。

+0

我认为你已经说过比严格需要强一点。 volatile对线程代码有帮助,特别是在单核心嵌入式平台上。但是你必须知道如何使用它。在使用或不使用DMA的情况下引用硬件寄存器时,它也是有效的强制措施,特别是要查询状态的寄存器。还有必要了解您的缓存以及如何正确管理缓存,并了解如何在您的平台上执行原子操作。 – RBerteig 2009-06-11 08:31:42

0

如果由于服务某些中断(即信号处理程序或其他(接近)原子变量)而声明为volatile的成员未发生更改,那么您应该不使用volatile(因为大多数编译器会将其优化掉)足够接近)。

否则,正如其他人所说..只是用那么它检查ASM转储,看看你的编译器实际上与你:)

在某些情况下,即同意GCC的某些版本..它值得一试的转储。

相关问题