volatile
классификатор сообщает компилятору, что переменная может изменить не то, что он изменится. В любом случае он не может спонтанно измениться; что-то должно заставить его измениться - даже если эта причина является внешней по отношению к коду.
код ошибочен в этом случае (или, по крайней мере, не служат примером эффекта volatile
в пути, возможно, вы хотели), так как параметр, передаваемый function()
является не объявлена нестабильной. Тот факт, что он имеет то же имя, что и глобальная переменная, может быть запутан, но, назначив глобальную переменную a
аргументу функции a
, вы немедленно отделили его от волатильности.
Если код был изменен (и сделал в силе и компилируется) таким образом:
volatile int a;
int function(void)
{
int x=a;
int y=a;
return x*y;
}
int main()
{
function();
return 1;
}
Тогда эффект volatile
здесь просто, что компилятор будет явно назначить x
и y
без применения каких-либо оптимизаций, которые иначе были бы возможны ,Без классификатора, компилятор может в противном случае (когда оптимизации включены) уменьшить function()
до всего:
int function(void)
{
return a * a ;
}
и может даже рядный целая функция. Кроме того, так как возвращаемое значение функции не назначено ни к чему, то компилятору likley оптимизировать весь код просто
int main()
{
return 1;
}
Если a
летуч, то присвоения x
и y
сусла произойти, если function()
является называется.
Цель volatile
является указание компилятору, что переменная может измениться за пределами кода, который сгенерировал компилятор (не то, что он будет изменить). Он обычно используется для обеспечения правильного поведения, когда переменная ссылается либо на аппаратный регистр, либо на память, которая совместно используется потоками, процессами или даже процессорами или ядрами в процессоре. Он также может использоваться для предотвращения «оптимизации» кода, который требуется (например, пустые счетчики ожидания «занято-ожидание»). В вашем примере (или, вернее, его пересмотре) a
не ссылается ни на одну подобную сущность, поэтому код будет вести себя так, как ожидалось, но, возможно, будет менее эффективным, чем в противном случае.
Но если я сделаю что-то вроде этого ... – Invictus
int square (volatile int * ptr) { int a, b; a = * ptr; b = * ptr; return a * b; } – Invictus
и позвоните в Square (& a) .... Теперь это даст мне разные значения ... Надеюсь, я прав .... Я? – Invictus