Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,452
Записей в блоге: 17
#1

const volatile - C++

13.08.2012, 03:53. Просмотров 2168. Ответов 29
Метки нет (Все метки)

Пример из Шилдт Г. "С++ Базовый курс (3-е издание, 2010)" стр 205

C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
const volatile

Непонятно почему Шилд называет это константным указателем на изменяемый объект.

Как я понимаю volatile здесь не играет ни какой роли в коде... а const относится к переменной, а не к указателю.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 03:53     const volatile
Посмотрите здесь:

const_cast: const и volatile - C++
Как известно const_cast сбрасывает наложенные ограничения при помощи модификаторов const и volatile. Как мне стало известно volatile -...

volatile - C++
зачем нужно ключевое слово volatile?

исследование volatile - C++
Здравствуйте. В университете дали задание: "Исследование квалификаторов volatile и инструкции барьера памяти LOCK в VS для разного...

Пример использования спецификатора volatile - C++
В приложенной картинке (из книги Г.С. Шилдта по C++) есть пример использования спецификатора volatile. Есть три вопроса. Первый: что...

Int* const или const int*? - C++
class A { public: A() : x(777) {} int* const GetX() { return &x; }

Что такое "volatile int" - C++
есть объявление и инициализация переменной: volatile int Sklad = 0; что такое "volatile"? с msdn не очень понял, кто сможет...

const - C++
объясните мне пожалуйста почему в конце объявления функций нужно писать const? точнее почему в данной ситуаций.. bool empty() const; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
13.08.2012, 04:32     const volatile #2
Вы книгу на английском найдите, тогда и видно будет, что имел ввиду автор
alkagolik
Заблокирован
13.08.2012, 07:31     const volatile #3
Avazart, volatile вполне актуально. const относится к данным.
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    const volatile int *x;
    volatile const int y = 6, *z = &y;
    x = &y;
    x = z;
    //*x = 7; //error
 
    return 0;
}
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 07:59     const volatile #4
Всё, что стоит слева от звёздочки, относится к адресуемому объекту. Всё, что справа, — к самой переменной-указателю.

const volatile char *p; именно это и значит: вы не можете изменять значение объекта по адресу p, но вы всегда будете в курсе его изменений другими потоками или чем там ещё, кеши не будут мешать и всё такое, что обычно с volatile. И это не запрещает вам присвоить переменной p другое значение.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
13.08.2012, 08:51     const volatile #5
[Задача] const volatile

Другими словами, это указатель к read-only данные, которые являются volatile
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,452
Записей в блоге: 17
13.08.2012, 13:59  [ТС]     const volatile #6
Цитата Сообщение от defer
Вы книгу на английском найдите, тогда и видно будет, что имел ввиду автор
Нашел там тоже самое написано.
Although it seems strange at first thought, it is possible to use const and volatile
together. For example, the following declaration is perfectly valid. It creates a const pointer to a volatile object.
C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
In this example, the cast is needed in order to transform the integer literal 0x2112
into a const volatile character pointer.
Цитата Сообщение от alkagolik Посмотреть сообщение
const относится к данным.
Ну и я о том, значит это указатель на константу, а не константный указатель
А
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Всё, что стоит слева от звёздочки, относится к адресуемому объекту.Всё, что справа, — к самой переменной-указателю.
Цитата Сообщение от alkagolik Посмотреть сообщение
volatile вполне актуально.
Почему тогда актуально? Если volatile также стоит до * как и const, а значит играет роль только const
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
13.08.2012, 14:25     const volatile #7
Цитата Сообщение от Avazart Посмотреть сообщение
Ну и я о том, значит это указатель на константу
Я уже писал как-то об этом, что это неверный перевод слова "constant"

В английском языке слово "constant" в первую очередь означает "постоянный", "неизменный". Ну а для русскоязычных людей как-то подсознательно на первый план вылезает "константа" (фиксированная числовая величина)
Другими словами, const-указатель, это НЕ указатель на константу, а указатель, по которому нельзя записывать

кое-что про const
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,452
Записей в блоге: 17
13.08.2012, 14:27  [ТС]     const volatile #8
Читаю тему...

Цитата Сообщение от Evg Посмотреть сообщение
C++
1
extern volatile const int iii;
Модификатор const с одной стороны говорит о том, что переменная не может изменяться, но с другой стороны модификатор volatile означает, что переменная может изменяться неявным для компилятора образом. Поиском желательно не пользоваться, а попробовать догадаться самому
Цитата Сообщение от Evg Посмотреть сообщение
В конструкции const volatile модификатор const относится только к языковой части, но не к аппаратной. Т.е. переменную const volatile программист не имеет права менять (компилятор будет ругаться), но аппаратура значение переменной может изменить. Т.е. volatile - это переменная, которую можно программно читать и писать (типа порта ввода-вывода), а const volatile - это переменная, которую программно можно только читать (что-то типа таймера)
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 14:33     const volatile #9
const и volatile — это ортогональные модификаторы. Они не взаимоисключающие или что-то в этом роде.

const — это просьба компилятору давать вам по голове за попытки написать код, изменяющий эту переменную. Конечно, компилятору можно заткнуть рот с помощью const_cast или хитрым жонглированием указателями, но от этого он и не должен спасать.

volatile — это требование генерировать код так, чтобы побочные эффекты, действующие на эту переменную (например, присваивание ей значения; в частности, чтение volatile-переменной тоже считается побочным эффектом), были завершены и видимы в так называемых sequence points (точках следования). Грубо говоря: чтобы перед и после каждого выражения значение volatile-переменной было определено и неизменно, вне зависимости от того, что там компилятор решит надумать оптимизировать и как эту переменную будут дёргать соседние потоки (или ОС). Между выражениями — может «самопроизвольно» изменяться.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,452
Записей в блоге: 17
13.08.2012, 14:35  [ТС]     const volatile #10
это НЕ указатель на константу, а указатель, по которому нельзя записывать
Ну так это оно и тоже... покрайней мере... в литературе применяется "указатель на констант" с оговорками что в действительности переменная может не быть константой сама по себе... повышение константности итп...

Ну а константный указатель обычно в литературе это указатель значение которого нельзя изменить ( не обьект)
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.08.2012, 14:42     const volatile #11
Поэтому лучше не писать какие-то "константные указатели", которые "обычно понимается так, но кое-где эдак", а писать кодом, который имеет один и тот же смысл всегда:
C++
1
2
3
4
5
/* выражение        допустимые операции */
int *s;              // s = 123; *s = 123;
const int *p;        // s = 123;
int * const q;       // *s = 123;
const int * const r; // никаких присваиваний
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,452
Записей в блоге: 17
13.08.2012, 14:44  [ТС]     const volatile #12
Ну а какую роль volatile играет в объявлении указателя?
Он относится к самому указателю или обьекту?
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
13.08.2012, 14:47     const volatile #13
Цитата Сообщение от Avazart Посмотреть сообщение
Читаю тему...
Первая тема была написана по времени намного раньше, чем вторая. И в тот момент у меня ещё не наступило просветления

Цитата Сообщение от Avazart Посмотреть сообщение
Ну так это оно и тоже...
Нет, не одно и то же. Понятие "указатель на константу" означает, что все чтения по этому указателю выдадут один и тот же результат. Но при наличии volatile это не будет верным (т.е. разные чтения по указателю могут дать разный результат). Т.е. понятие "указатель, по которому нельзя записывать" оно более корректное

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Ну а какую роль volatile играет в объявлении указателя?
Он относится к самому указателю или обьекту?
Если volatile относится к звёздочке, то относится к памяти, на которую смотрит указатель. Смысл такой, что в коде:

C
volatile int *p;
int x, y;
 
x = *p;
y = *p;
Итоговые значения переменных x и y могут быть различными
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,452
Записей в блоге: 17
13.08.2012, 14:58  [ТС]     const volatile #14
Ну так они будут стопудово одинаковыми только если p указывает на константу.
C++
1
2
const int a=6;
int *p=&a;
в других случаях с volatile или без они могут отличатся

Или имеется ввиду именно в контексте многопоточности?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 15:03     const volatile
Еще ссылки по теме:

Const #define - C++
{ const int HOLFSDsize= 2;//#define HOLFSDsize 2 // m-угольник void HOLFSD() { int i, n, l; // объявляем...

static и const - C++
static void A(); Что дает этот статик? Что он вообще дает? int A() const; Что дает конст в данном случае? static int...

const function - C++
Здравствуйте, совсем забыл не напомните, что меняется в функции в зависимости от расположения const: Например: const int const...

No init for const! - C++
Доброе утро, котаны!:) Вопрос - в джаве есть возможность сделать такую штуку final boolean someBool; someBool = true; То есть...

'const char* ...' does not much 'const char*' ??? - C++
Доброе время суток, товарищи! Застрял на ошибке: " error: argument of type ‘const char* (person::)()’ does not match ‘const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,931
Записей в блоге: 26
13.08.2012, 15:03     const volatile #15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так они будут стопудово одинаковыми только если p указывает на константу.
volatile-объект по определению не может быть константной

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так они будут стопудово одинаковыми только если p указывает на константу.
Будут. Только всё равно это правильно называть "указатель, по которому нельзя записывать", а не указатель на константу. const-указатель может указывать и не на константу, но в этом случае программист обязан обеспечить, чтобы на время жизни указателя НЕ менялось значение по этому адресу.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
void func1 (int *p)
{
  ....
}
 
void func2 (void)
{
  int x = 5;
 
  func1 (&x);
  x++;
  func2 (&x);
}
в данном примере указатель p (параметр функции func1) НЕ указывает на константу, но за время жизни указателя p значение переменной x (на которую смотрит указатель) не меняется
Yandex
Объявления
13.08.2012, 15:03     const volatile
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru