LINUX.ORG.RU

если в java разрешить обращатся к не-final переменным из анонимных классов. тогда может пригодитbся.

crowbar
()
Ответ на: комментарий от splinter

Так нагляднее:

volatile int a = 4;

int main(void)
{
    printf("a = %d\n", a = 7);
}

splinter ★★★★★
() автор топика

Ну вот например указатель на неё каким-нибудь макаром передаётся в функцию, где запоминается в глобальной переменной и используется другими функциями. Все эти функции вызываются, само собой, только в области, где эта переменная определена и существует.

Я на сишечке сто лет не кодил, мог и фигню сморозить, впрочем.

amomymous ★★★
()
Последнее исправление: amomymous (всего исправлений: 1)
Ответ на: комментарий от ramon13666

ты прав, походу я загнался, , извиняй бро.

splinter ★★★★★
() автор топика
Ответ на: комментарий от ramon13666

Пжалуста:

#include <stdio.h>

int *
foo()
{
        static int z = 1;
        return &z;
}

int
main()
{
        int *p;

        for (p = foo(); *p < 10; ++*p)
                printf("%d\n", *p);

        return 0;
}
PS: знаю, что чуть-чуть читерство (static уходит в глобальный контекст), но всё же.

beastie ★★★★★
()
Ответ на: комментарий от beastie

о спасиб, нужный вариант, хотя со статик :-) а как насчет extern?

splinter ★★★★★
() автор топика
Ответ на: комментарий от beastie

static уходит в глобальный контекст

ну не совсем уж в глобальный контекст а только в контекст модуля.

splinter ★★★★★
() автор топика

Было на БХ: http://habrahabr.ru/company/abbyy/blog/223769/
А вообще конструкции типа:

int CRYPTO_memcmp( const void* f, const void* s, size_t length )
{
   size_t i;
   const volatile unsigned char* first = f;
   const volatile unsigned char* second = s;
   unsigned char magic = 0;
   for( i = 0; i < length; i++ ) {
       magic |= (first[i] ^ second[i]);
   }
   return magic;
}

Вынесут мозг неподготовленным.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

ну например, стек (в котором выделяются локальные переменные) может модифицироваться извне

Harald ★★★★★
()
Ответ на: комментарий от Harald

стек (в котором выделяются локальные переменные) может модифицироваться извне

Но блеать КАК!!!???

splinter ★★★★★
() автор топика

В man longjmp описан случай применения volatile для локальных переменных.

Deleted
()
Ответ на: комментарий от splinter

да 100500 вариантов

например, стек выделен в том же участке памяти, куда может писать какой-нибудь девайс через DMA

Harald ★★★★★
()
Ответ на: комментарий от EXL

Вау, я даже понял почему так. Но сам вряд ли б написал. Хотя и не для моей области такие конструкции.

ramon13666 ★★★
()
Ответ на: комментарий от splinter

у тебя содержимое указателя развалится на выходе из функции!

Не развалится, static же.

beastie ★★★★★
()
Ответ на: комментарий от ramon13666
#include <stdio.h>

int *f(void)
{
  int a = 5;
  return &a;
}

int main(void)
{
   int *s = f();
   printf("%d\n", *s);
   *s = 2;
   printf("%d\n", *s);
   s = f();
   printf("%d\n", *s);

}

хотя волатильность тут приплести тяжелее.

а вот static вполне влияние оказывает.

cvs-255 ★★★★★
()
Последнее исправление: cvs-255 (всего исправлений: 3)

Вам что, делать нехер?

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от splinter

с помощью указателя. Хотя результаты вполне могут оказаться платформозависимыми.

cvs-255 ★★★★★
()

Если я правильно помню, то сабж это указание компилятору не держать переменную в регистре, всегда перечитывать из ячейки, и не откладывать запись между seqpoint'ами. Не обязательно тут dma, mmap, или особая память. Можно например создать тучу тредов, передать им адрес локальной переменной, а самому не выходить, ждать пока все поджойнятся. Треды будут с ней чо-то делать в критической секции, например. Если не делать ее volatile, то код треда может отложить запись, и переменная иногда будет невалидной в другом треде, хотя синхронизацию ты соблюл.

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

arturpub ★★
()
Ответ на: комментарий от arturpub

По ссылке выше прочитай. Интересная статья.

EXL ★★★★★
()
Ответ на: комментарий от cvs-255

а ты еще какую нибудь локальную переменную объяви, а лучше массив.

splinter ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Я использую волятильные переменные. Но это на мк.

Переменная «a» развалится после выхода из функции f, разве нет? Статик останется, но не проще ли тогда использовать глобальную?

ramon13666 ★★★
()
Ответ на: комментарий от ramon13666

Развалится — нет такого слова. Попытка пройти по тому указателю после возврата вызовет UB. Статик внутри функции нужен для того, чтобы не засирать неймспейс юнита (это не проще и не сложнее).

arturpub ★★
()
Ответ на: комментарий от ramon13666

Переменная «a» развалится после выхода из функции f, разве нет

что значит развалится? указатель есть, указывает на стек, т.е. segmentation fault не произойдет. в чем проблема?

cvs-255 ★★★★★
()

в volatile обычно есть смысл в том, чтоб хитрожёпый конпелятор нетянулся её заоптимизировать её использовать и что-то упростить/выкинуть за кажущейся ему ненадобностью.

n_play
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.