Почему 'энергозависим' паразитный в C++?

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

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 энергозависимый. Однако, после того как я считал значение p, Я не забочусь при доступе v энергозависимо. Почему это требуется это v быть объявленными энергозависимые?

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

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

22
задан Steve 19 March 2010 в 14:47
поделиться

2 ответа

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

int* volatile p;
36
ответ дан 29 November 2019 в 04:15
поделиться

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

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

14
ответ дан 29 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: