Подтвердить что ты не робот

Почему "летучие" паразиты в С++?

Рассмотрим следующий код:

int main()                                                                      
{                                                                             
    int i;                                                                      
    volatile int* p = &i;                                                       
    int *v = p;                                                                 
    return 0;                                                                   
}

Это дает ошибку в g++:

$ g++ -o volatile volatile.cpp 
volatile.cpp: In function ‘int main()’:
volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’

Мое намерение состояло в том, что я хочу сделать p volatile. Однако, как только я прочитал значение p, мне все равно, является ли доступ к v неустойчивым. Почему требуется, чтобы v был объявлен изменчивым?

Это, конечно, гипотетический код. В реальной ситуации вы можете себе представить, что p указывает на ячейку памяти, но изменяется извне, и я хочу, чтобы v указывал на то место, которое p указывало во время v = p, даже если позже p изменен извне. Поэтому p является изменчивым, но v не является.

Кстати, меня интересует поведение, когда это считается C и С++, но в C это порождает предупреждение, а не ошибку.

4b9b3361

Ответ 1

Если вы имеете в виду, что указатель должен быть изменчивым, а не объектом, на который он указывает, тогда объявите его как

int* volatile p;

Ответ 2

В С++ ключевое слово volatile применяет те же ограничения, что и вы, как const. Стандарт ссылается на это как на "cv-qualification", как на "const/volatile qualification". Consts может использоваться только consts, и во многом таким же образом летучие могут использоваться только летучими.

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