Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

const volatile

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

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

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


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

Как я понимаю volatile здесь не играет ни какой роли в коде... а const относится к переменной, а не к указателю.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.08.2012, 03:53
Ответы с готовыми решениями:

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

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

int\ volatile int \ const int
Товарищи, паника! Имеется код: int a = 5; std::cout << "Init value a: " << a << "\n"; int *p; p = (int*) &a; *p = 0; ...

29
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.08.2012, 16:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
Или имеется ввиду именно в контексте многопоточности?
Цитата Сообщение от Avazart Посмотреть сообщение
Как ?
Многопоточность не при чём. Дело в том, что данные в некоторых участках памяти изменяются аппаратным образом и ни процессор, ни тем более компилятор об этих изменениях ничегоне знают и знать не могут. Т.е. пришли к тебе данные во внешний порт, это событие происходит независимо, а потому данные в некотором участке памяти меняются независимо от процессора и запускаемой задачи.

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

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

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

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

Добавлено через 23 минуты
Кстати, а описание этого дела в самом стандарте можно найти?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.08.2012, 17:10
Цитата Сообщение от The_Immortal Посмотреть сообщение
Кстати, а описание этого дела в самом стандарте можно найти?
"Этого дела" - это чего именно?
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 17:26
Evg, про "константные указатели" и "указатели, по которым нельзя записывать" - хотя это, наверное, к стандарту отношения не имеет. Я просто хотел посмотреть как там на англ. эти термины звучат
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 17:28  [ТС]
Дьюхерст "Скользкие места С++" Совет6. "О неправильно интерпритации const"
C++
1
extern const volatile time_t clock // extern !!!


Мой пример на 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++;
 }
//---------------------------------------------------------------------------
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.08.2012, 17:34
Цитата Сообщение от Avazart Посмотреть сообщение
Мой пример на Builder
Всё равно этим примером ты не сможешь продемонстрировать работу const volatile. Под демонстрацией я подразумеваю примерно следующее. Принаписании const volatile программа работает правильно. Убираем volatile - программ начинает работать неправильно. В противном случае пример в общем-то ничего не будет демонстрировать
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 18:09  [ТС]
Согласен это совсем не то... поспешил...

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

Что может произойте страшного если мы объявим не
C++
1
const volatile unsigned char *port = (const volatile char *) 0x2112;
А к примеру :
C++
1
const unsigned char *port = (const char *) 0x2112;
Какова тут роль volatile ?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
13.08.2012, 19:42
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от 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
3
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 23:34  [ТС]
Спасибо, многое прояснило.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
18.08.2012, 13:20
Цитата Сообщение от The_Immortal Посмотреть сообщение
Было бы неплохо
В итоге все мне ответили одно и то же. Термины "constaint pointer" (int * const p) и "pointer to constant value" (const int * p). Собственно, я тоже всегда так думал, но на всякий случай подстраховался, ибо Шилд - это всё-таки не тот ширпотреб российского издания, которого сейчас полно на полках

Потом начали внимательно смотреть цитату из Шилда (из поста 6) и обратили внимание, что там написано НЕ "constant pointer", а "const pointer". Т.е. слово "const" скорее всего подразумевалось как ключевое слово языка, но не как слово "constant". Возможно, что тут есть какая-то тонкая игра слов на английском языке, а по-русски это бы выглядело что-то типа написания через дефис: "const-указатель", что должно восприниматься как указатель на const. К сожалению, те профессиональные переводчики, которые у нас есть, не в состоянии подтвердить или опровергнуть нашу версию, поскольку программистами не являются
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.08.2012, 13:20

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const;
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start-&gt;next;} return c; } Функция...

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *'
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Модификатор const для параметра функции не const?
void foo(const int N) { int Arr; //&lt;-- ??? } В clang это работает. В VisualStudio 2015 нет.


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru