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

const volatile - C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,775
Записей в блоге: 17
13.08.2012, 03:53     const volatile #1
Пример из Шилдт Г. "С++ Базовый курс (3-е издание, 2010)" стр 205

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

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

Как я понимаю volatile здесь не играет ни какой роли в коде... а const относится к переменной, а не к указателю.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16942 / 5347 / 329
Регистрация: 30.03.2009
Сообщений: 14,377
Записей в блоге: 26
13.08.2012, 16:26     const volatile #21
Цитата Сообщение от Avazart Посмотреть сообщение
Или имеется ввиду именно в контексте многопоточности?
Цитата Сообщение от Avazart Посмотреть сообщение
Как ?
Многопоточность не при чём. Дело в том, что данные в некоторых участках памяти изменяются аппаратным образом и ни процессор, ни тем более компилятор об этих изменениях ничегоне знают и знать не могут. Т.е. пришли к тебе данные во внешний порт, это событие происходит независимо, а потому данные в некотором участке памяти меняются независимо от процессора и запускаемой задачи.

На пальцах приблизительно я пытался объяснить тут: Как в C++ управлять пк

Цитата Сообщение от The_Immortal Посмотреть сообщение
Evg, у меня к Вам вопросик относительно правильных терминов. Как мы уже разобрались, то Шилдтовское "const pointer" - "указатель, по которому нельзя записывать".
К сожалению, не могу встретить в книге случая "константного указателя" или "немодифицируемого указателя" (int *const p) - меня интересует как такое будет звучать на англ?
Тут ничего не могу сказать На самом деле изначально константным (немодифицируемым) является переменная, которая является указателем. Но если очень нужно, то я могу поспрашивать тех, кто свободно на английском разговаривает

Добавлено через 51 секунду
Цитата Сообщение от Avazart Посмотреть сообщение
какой тут может быть пример?
Пример надо трясти у тех, кто занимается кодами близко к аппаратруе: разработчики операционных систем или драйверов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 17:02     const volatile #22
Evg,
Цитата Сообщение от Evg Посмотреть сообщение
Но если очень нужно, то я могу поспрашивать тех, кто свободно на английском разговаривает
Было бы неплохо
На самом деле я уже выше написал свои "догадки" по поводу терминологии. Но все же не дает покоя почему Шилдт ввел "const pointer" (что на мой взгляд совсем не логично), когда, повторюсь, Дьюхерст называет этот же случай "pointer to const".

Кстати, а в какой еще литературе подобный раздел (с константными указателями и указателями, по которым нельзя записывать) можно застать, не подскажите? Хочу сделать дополнительное языковое исследование

Добавлено через 23 минуты
Кстати, а описание этого дела в самом стандарте можно найти?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16942 / 5347 / 329
Регистрация: 30.03.2009
Сообщений: 14,377
Записей в блоге: 26
13.08.2012, 17:10     const volatile #23
Цитата Сообщение от The_Immortal Посмотреть сообщение
Кстати, а описание этого дела в самом стандарте можно найти?
"Этого дела" - это чего именно?
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 17:26     const volatile #24
Evg, про "константные указатели" и "указатели, по которым нельзя записывать" - хотя это, наверное, к стандарту отношения не имеет. Я просто хотел посмотреть как там на англ. эти термины звучат
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,775
Записей в блоге: 17
13.08.2012, 17:28  [ТС]     const volatile #25
Дьюхерст "Скользкие места С++" Совет6. "О неправильно интерпритации const"
C++
1
extern const volatile time_t clock // extern !!!
const volatile

Мой пример на Builder

Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
 
// ...
 
extern const volatile clock;
//---------------------- Просмотреть clock  -------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Caption = clock; // смотрим в заголовке значение переменной
}
//-----------------------  Изменить  clock -------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
   inc(); // меняем значение переменной через ф-цию
}
//---------------------- Попытка изменить из этого модуля -------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  clock= 5;   /* [BCC32 Error] Unit1.cpp(29): E2024 Cannot modify a const object */
}
//---------------------------------------------------------------------------
Unit2.h
C++
1
2
3
//---------------------------------------------------------------------------
void inc();
//---------------------------------------------------------------------------
Unit2.cpp
C++
1
2
3
4
5
6
7
8
9
#include "Unit2.h"
//---------------------------------------------------------------------------
int clock; // ну  или  volatile int clock;
//---------------------------------------------------------------------------
void inc()
 {
   clock++;
 }
//---------------------------------------------------------------------------
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16942 / 5347 / 329
Регистрация: 30.03.2009
Сообщений: 14,377
Записей в блоге: 26
13.08.2012, 17:34     const volatile #26
Цитата Сообщение от Avazart Посмотреть сообщение
Мой пример на Builder
Всё равно этим примером ты не сможешь продемонстрировать работу const volatile. Под демонстрацией я подразумеваю примерно следующее. Принаписании const volatile программа работает правильно. Убираем volatile - программ начинает работать неправильно. В противном случае пример в общем-то ничего не будет демонстрировать
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,775
Записей в блоге: 17
13.08.2012, 18:09  [ТС]     const volatile #27
Согласен это совсем не то... поспешил...

Добавлено через 29 минут
Возврящаясь к исходному примеру допустим данные в ячейке 0x2112 периодически меняется аппаратно...

Что может произойте страшного если мы объявим не
C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
А к примеру :
C++
1
const unsigned char *port = (const char *) 0x2112;
Какова тут роль volatile ?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16942 / 5347 / 329
Регистрация: 30.03.2009
Сообщений: 14,377
Записей в блоге: 26
13.08.2012, 19:42     const volatile #28
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Avazart Посмотреть сообщение
Какова тут роль volatile ?
C
const /* volatile */ int *port;
 
int func (void)
{
  int a, b;
 
  a = *port;
  b = *port;
 
  return a * b;
}
Без volatile компилятор соптимизировал два обращения в один и тот же участок памяти и заменил их на одно обращение. Т.е. вместо "b = *port" по сути дела построил код "b = a":

Bash
$ gcc t.c -O2 -S
$ cat t.s
...
        movl    port, %eax
        pushl   %ebp
        movl    %esp, %ebp
        popl    %ebp
        movl    (%eax), %eax  <--- прочитали *port
        imull   %eax, %eax    <--- перемножили два одинаковых значения (соптимизировали)
...
теперь раскомментируем volatile и увидим, что больше эти два обращения в один и тот же участок памяти не оптимизируются:

Bash
$ gcc t.c -O2 -S
$ cat t.s
...
        movl    port, %edx
        pushl   %ebp
        movl    %esp, %ebp
        popl    %ebp
        movl    (%edx), %eax  <--- первый раз прочитали *port
        movl    (%edx), %edx  <--- второй раз прочитали *port
        imull   %edx, %eax
...
В данном тесте модификатор const вообще никакой роли не играет. Он влияет только на то, что без const'а компилятор разрешит операцию "*port = 0", а с const'ом - нет

Добавлено через 6 минут
В общем старый мусор из этого поста грохнул и нормальный тест нарисовал

Добавлено через 6 минут
Ну и ещё две ссылки до кучи:
Инициализация статического массива
Пример использования спецификатора volatile
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,775
Записей в блоге: 17
13.08.2012, 23:34  [ТС]     const volatile #29
Спасибо, многое прояснило.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2012, 13:20     const volatile
Еще ссылки по теме:

volatile C++
C++ int const * const foo(const int* param) const - разъясните значение квалификаторов
C++ Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' C++
C++ Модификатор const для параметра функции не const?

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16942 / 5347 / 329
Регистрация: 30.03.2009
Сообщений: 14,377
Записей в блоге: 26
18.08.2012, 13:20     const volatile #30
Цитата Сообщение от The_Immortal Посмотреть сообщение
Было бы неплохо
В итоге все мне ответили одно и то же. Термины "constaint pointer" (int * const p) и "pointer to constant value" (const int * p). Собственно, я тоже всегда так думал, но на всякий случай подстраховался, ибо Шилд - это всё-таки не тот ширпотреб российского издания, которого сейчас полно на полках

Потом начали внимательно смотреть цитату из Шилда (из поста 6) и обратили внимание, что там написано НЕ "constant pointer", а "const pointer". Т.е. слово "const" скорее всего подразумевалось как ключевое слово языка, но не как слово "constant". Возможно, что тут есть какая-то тонкая игра слов на английском языке, а по-русски это бы выглядело что-то типа написания через дефис: "const-указатель", что должно восприниматься как указатель на const. К сожалению, те профессиональные переводчики, которые у нас есть, не в состоянии подтвердить или опровергнуть нашу версию, поскольку программистами не являются
Yandex
Объявления
18.08.2012, 13:20     const volatile
Ответ Создать тему
Опции темы

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