Как вы объявляете какой-либо член структуры как изменчивый?В C, как вы объявляете членов структуры неустойчивыми?
ответ
Точно так же, как и не- 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 {...}"
но выше метод для отдельных полей.
Должно быть довольно прямо вперед в соответствии со статьей this:
Наконец, если применить летучий к структуры или объединения, все содержимое из структуры/объединения неустойчивы. Если вы не хотите этого поведения, вы можете применить изменчивый классификатор к отдельным членам структуры/союза .
Просто предупреждение о ключевом слове C/C++ volatile.
Если вы не знаете, что делаете, вы никогда не должны его использовать.
C/C++ летучий! = Java/C# летучего
летучего не помогает в многопоточном коде, если вы действительно не знаете, что вы делаете, вы должны использовать C++ 0x атомного шаблона (или что-то подобное).
Единственный раз, когда мне приходилось использовать volatile - это управлять аппаратными регистрами.
Если члены, объявленные как изменчивые, не изменены из-за обслуживания некоторого прерывания (то есть обработчик сигнала или другая (близкая) атомная переменная), вероятно, вы не должны использовать volatile (поскольку большинство компиляторов будет оптимизировать его, если его не достаточно близко).
В противном случае, как уже говорили другие .. просто использовать его затем изучить ассемблер отвалов, чтобы увидеть, если ваш компилятор на самом деле согласен с вами :)
В некоторых случаях, то есть некоторые версии GCC .. его стоит проверить тех, отвалов.
Я думаю, вы заявили, что немного сильнее, чем это строго необходимо. volatile помогает с потоковым кодом, особенно на одноядерных встроенных платформах. Но вы должны знать, как его использовать. Это также эффективно, когда ссылки на аппаратные регистры с DMA или без них, особенно регистр, который будет опрошен для статуса. Также необходимо понимать ваш кеш и как правильно управлять им, а также понимать, как выполнять атомные операции на вашей платформе. – RBerteig
Вы правы. Я не знал, что думал, когда я сказал DMA, я имел в виду MMIO. Я отредактировал ответ на что-то лучшее (надеюсь). –
Согласно wikipedia (http://en.wikipedia.org/wiki/Volatile_variable), C#, похоже, имеет такое же поведение, что и C/C++, тогда как только Java имеет другую семантику. –