2009-06-11 3 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; 
} 

Вы можете отметить весь struct летучим с помощью "volatile struct _a {...}" но выше метод для отдельных полей.

9

Должно быть довольно прямо вперед в соответствии со статьей this:

Наконец, если применить летучий к структуры или объединения, все содержимое из структуры/объединения неустойчивы. Если вы не хотите этого поведения, вы можете применить изменчивый классификатор к отдельным членам структуры/союза .

1

Просто предупреждение о ключевом слове C/C++ volatile.

Если вы не знаете, что делаете, вы никогда не должны его использовать.

C/C++ летучий! = Java/C# летучего

летучего не помогает в многопоточном коде, если вы действительно не знаете, что вы делаете, вы должны использовать C++ 0x атомного шаблона (или что-то подобное).

Единственный раз, когда мне приходилось использовать volatile - это управлять аппаратными регистрами.

+0

Я думаю, вы заявили, что немного сильнее, чем это строго необходимо. volatile помогает с потоковым кодом, особенно на одноядерных встроенных платформах. Но вы должны знать, как его использовать. Это также эффективно, когда ссылки на аппаратные регистры с DMA или без них, особенно регистр, который будет опрошен для статуса. Также необходимо понимать ваш кеш и как правильно управлять им, а также понимать, как выполнять атомные операции на вашей платформе. – RBerteig

+0

Вы правы. Я не знал, что думал, когда я сказал DMA, я имел в виду MMIO. Я отредактировал ответ на что-то лучшее (надеюсь). –

+0

Согласно wikipedia (http://en.wikipedia.org/wiki/Volatile_variable), C#, похоже, имеет такое же поведение, что и C/C++, тогда как только Java имеет другую семантику. –

0

Если члены, объявленные как изменчивые, не изменены из-за обслуживания некоторого прерывания (то есть обработчик сигнала или другая (близкая) атомная переменная), вероятно, вы не должны использовать volatile (поскольку большинство компиляторов будет оптимизировать его, если его не достаточно близко).

В противном случае, как уже говорили другие .. просто использовать его затем изучить ассемблер отвалов, чтобы увидеть, если ваш компилятор на самом деле согласен с вами :)

В некоторых случаях, то есть некоторые версии GCC .. его стоит проверить тех, отвалов.