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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
#1

const volatile - C++

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

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

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

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

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

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

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

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

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

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

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

29
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 15:11 #16
Evg, у меня к Вам вопросик относительно правильных терминов. Как мы уже разобрались, то Шилдтовское "const pointer" - "указатель, по которому нельзя записывать".
К сожалению, не могу встретить в книге случая "константного указателя" или "немодифицируемого указателя" (int *const p) - меня интересует как такое будет звучать на англ?
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
13.08.2012, 15:15  [ТС] #17
Цитата Сообщение от Evg Посмотреть сообщение
volatile-объект по определению не может быть константной
Ну, а в записи
C++
1
const volatile int x=5;
volatile не играет никакой роли ?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.08.2012, 15:21 #18
Цитата Сообщение от Avazart Посмотреть сообщение
Ну, а в записи
C++
1
const volatile int x=5;
volatile не играет никакой роли ?
наша песня хороша, начинай сначала

Цитата Сообщение от Evg Посмотреть сообщение
В конструкции const volatile модификатор const относится только к языковой части, но не к аппаратной. Т.е. переменную const volatile программист не имеет права менять (компилятор будет ругаться), но аппаратура значение переменной может изменить. Т.е. volatile - это переменная, которую можно программно читать и писать (типа порта ввода-вывода), а const volatile - это переменная, которую программно можно только читать (что-то типа таймера)
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
const — это просьба компилятору давать вам по голове за попытки написать код, изменяющий эту переменную
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
13.08.2012, 15:25  [ТС] #19
Т.е.volatile играет роль только придется x кастовать что бы изменить?

И что значит
но аппаратура значение переменной может изменить.
Как ?
- это переменная, которую программно можно только читать (что-то типа таймера)
какой тут может быть пример?
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 16:16 #20
Цитата Сообщение от The_Immortal Посмотреть сообщение
Evg, у меня к Вам вопросик относительно правильных терминов. Как мы уже разобрались, то Шилдтовское "const pointer" - "указатель, по которому нельзя записывать".
К сожалению, не могу встретить в книге случая "константного указателя" или "немодифицируемого указателя" (int *const p) - меня интересует как такое будет звучать на англ?
В общем-то, возможно, что у всех по-разному

Вот к примеру книжка Стивена Дьюхерста "C++. Священные знания" (Stephen C. Dewhurst "C++ Common Knowledge"):
Тема 8. Константные указатели и указатели на константу
Item 8. Const Pointers and Pointers to Const
У Шилдта же под "const pointer" подразумевается "pointer to const" (по Дьюхерсту), что не очень-то логично Так что если придерживаться оригинальной терминологии, то, например, у Дьюхерста данные термины введены корректнее, нежели у Шилдта (а точнее термин "const pointer").

Ну а касательно "pointer to const" - "указатель на константу" (также по Дьюхерсту). Такой перевод имеет место быть (и мне кажется много где), поэтому Avazart и употреблял "указатель на константу". На самом деле звучит не очень правильно, но я думаю, что большинству должно быть интуитивно понятно, что здесь подразумевается "указатель, по которому нельзя записывать"
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,218
Записей в блоге: 27
13.08.2012, 16:26 #21
Цитата Сообщение от Avazart Посмотреть сообщение
Или имеется ввиду именно в контексте многопоточности?
Цитата Сообщение от Avazart Посмотреть сообщение
Как ?
Многопоточность не при чём. Дело в том, что данные в некоторых участках памяти изменяются аппаратным образом и ни процессор, ни тем более компилятор об этих изменениях ничегоне знают и знать не могут. Т.е. пришли к тебе данные во внешний порт, это событие происходит независимо, а потому данные в некотором участке памяти меняются независимо от процессора и запускаемой задачи.

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

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

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

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

Добавлено через 23 минуты
Кстати, а описание этого дела в самом стандарте можно найти?
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,218
Записей в блоге: 27
13.08.2012, 17:10 #23
Цитата Сообщение от The_Immortal Посмотреть сообщение
Кстати, а описание этого дела в самом стандарте можно найти?
"Этого дела" - это чего именно?
0
The_Immortal
1552 / 488 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
13.08.2012, 17:26 #24
Evg, про "константные указатели" и "указатели, по которым нельзя записывать" - хотя это, наверное, к стандарту отношения не имеет. Я просто хотел посмотреть как там на англ. эти термины звучат
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
13.08.2012, 17:28  [ТС] #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++;
 }
//---------------------------------------------------------------------------
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,218
Записей в блоге: 27
13.08.2012, 17:34 #26
Цитата Сообщение от Avazart Посмотреть сообщение
Мой пример на Builder
Всё равно этим примером ты не сможешь продемонстрировать работу const volatile. Под демонстрацией я подразумеваю примерно следующее. Принаписании const volatile программа работает правильно. Убираем volatile - программ начинает работать неправильно. В противном случае пример в общем-то ничего не будет демонстрировать
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
13.08.2012, 18:09  [ТС] #27
Согласен это совсем не то... поспешил...

Добавлено через 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
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,218
Записей в блоге: 27
13.08.2012, 19:42 #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
3
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 293
Регистрация: 10.12.2010
Сообщений: 23,952
Записей в блоге: 17
13.08.2012, 23:34  [ТС] #29
Спасибо, многое прояснило.
0
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,218
Записей в блоге: 27
18.08.2012, 13:20 #30
Цитата Сообщение от The_Immortal Посмотреть сообщение
Было бы неплохо
В итоге все мне ответили одно и то же. Термины "constaint pointer" (int * const p) и "pointer to constant value" (const int * p). Собственно, я тоже всегда так думал, но на всякий случай подстраховался, ибо Шилд - это всё-таки не тот ширпотреб российского издания, которого сейчас полно на полках

Потом начали внимательно смотреть цитату из Шилда (из поста 6) и обратили внимание, что там написано НЕ "constant pointer", а "const pointer". Т.е. слово "const" скорее всего подразумевалось как ключевое слово языка, но не как слово "constant". Возможно, что тут есть какая-то тонкая игра слов на английском языке, а по-русски это бы выглядело что-то типа написания через дефис: "const-указатель", что должно восприниматься как указатель на const. К сожалению, те профессиональные переводчики, которые у нас есть, не в состоянии подтвердить или опровергнуть нашу версию, поскольку программистами не являются
2
18.08.2012, 13:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2012, 13:20
Привет! Вот еще темы с ответами:

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

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

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,&quot;acc.dll&quot;,RT_RCDATA); if(!hRes){ } HGLOBAL...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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