|
|
||||||||||||||||||||||||||||||||||||||||||||||
[Задача] const volatile27.05.2011, 15:53. Показов 16594. Ответов 29
Метки задачи от evg (Все метки)
Предполагаю, что читатель значет, что такое const и volatile. Но не факт, что все знают, как они влияют на генерацию кода компилятором. И можно это пояснить на которких примерах
1. Модификатор const
Теперь пометим iii модификатором const и посмотрим на код
2. Модификатор volatile
Теперь добавим модификатор volatile
Внимание вопрос. Что по ваему мнению означает переменная, описанная как
11
|
||||||||||||||||||||||||||||||||||||||||||||||
| 27.05.2011, 15:53 | |
|
Ответы с готовыми решениями:
29
И снова volatile. Глобальный массив, изменяемый в обработчике прерывания, должен быть volatile?
|
|
|
|||||||||||||||||||||||||||||||||||||
| 28.05.2011, 11:37 | |||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
В общем там, где я это нарыл, объяснение было такое: нет перегруженной версии operator<<() для
volatile const char*, поэтому требуется приведение типа. К const char* компилятор привести не может (ибо volatile), как и к volatile char* (ибо const), поэтому (как там написанно) согласно стандарту указатель приводиться к bool*. По поводу стандарта не знаю, я с ним не дружу в силу плохого английского. Вот решил проверить вышенаписанное. Итак - MSVS
Дальше - в пояснении сказано, что в GCC для достижение такого же результата нужно заменить "0" на "false". Но ведь если, как там говориться, volatile const char* приводится к bool* согласно стандарту, а g++, как мы знаем, более дружен со стандартом, чем компилятор Intel, то разницы быть не должно. Смотрим: Во первых выводится 1 при *p="0" (ну и естественно при *p="false"), собственно как я и ожидал. Смотрим, что там внутри:
Добавлено через 4 минуты
Почитал про синтаксис AT&T, инструкция
Не по теме: осталость добавить как в лабораторных пишут:"опытным путем было установленно, что указатель volatile const char* компилятор приведет к bool*":D
4
|
|||||||||||||||||||||||||||||||||||||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 28.05.2011, 13:59 | ||
|
0
|
||
|
|
||
| 28.05.2011, 22:16 [ТС] | ||
|
По поводу того, что же такое const volatile
В конструкции const volatile модификатор const относится только к языковой части, но не к аппаратной. Т.е. переменную const volatile программист не имеет права менять (компилятор будет ругаться), но аппаратура значение переменной может изменить. Т.е. volatile - это переменная, которую можно программно читать и писать (типа порта ввода-вывода), а const volatile - это переменная, которую программно можно только читать (что-то типа таймера)
2
|
||
|
|
|||||||||||||||||||||||
| 01.06.2011, 16:31 [ТС] | |||||||||||||||||||||||
Мне более понятна система команд sparc, а потому вот код, полученный на sparc'овском gcc:
Добавлено через 2 минуты
1
|
|||||||||||||||||||||||
|
|
|||||||||||
| 01.06.2011, 18:01 | |||||||||||
И вот еще что - скомпилировал такой код в MSVS:
Добавлено через 2 минуты
0
|
|||||||||||
|
|
|||
| 01.06.2011, 20:25 [ТС] | |||
|
0
|
|||
|
|
||||
| 01.06.2011, 20:43 | ||||
|
0
|
||||
| 01.06.2011, 23:08 | |
|
0
|
|
|
|
|
| 02.06.2011, 11:14 | |
Сообщение было отмечено как решение
Решение
Порылся в стандарте, т.к. с английским совсем туго, то понял я не много, но суть, вроде как, уловил.
Вобщем нет четкого определения, что volatile const char* при случае будет приведен к bool, но там описана некая схема приведения типов (что-то типа иерархии (conversion rank)). На сколько я понял (не факт, что правильно) в случае, когда по какой-либо причине невозможно приведение к конктретному типу, то приведение осуществляется согласно этому conversion rank. Суть в том, что одни типы имеют более высокий rank, чем другие. Т.е. сначала пробуем превести к типу, имеющему самый низкий rank, если это невозможно, значит двигаемся выше и пробуем превести к слещующему типу. И, как я понял, bool является первым возможным типом для volatile const char*, поэтому к нему и приводится. Может кто-то поправит?
4
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 02.06.2011, 15:39 | ||
|
В Страуструпе написано :
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 02.06.2011, 16:12 | |
|
Kastaneda, М. Не буду спорить. Скорее всего про это и написано.
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 02.06.2011, 16:17 | |
|
ForEveR, просто в случае с if вполне законно неявно привести указатель к bool, а вот в случае с std::cout как-то не вяжется...
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||||||||||||
| 02.06.2011, 16:57 | |||||||||||||||||||||
|
А так еще веселее..
Добавлено через 4 минуты Веселимся)
Собственно
Ну или так. Вообщем просто нет подходящего оператора.
0
|
|||||||||||||||||||||
|
Higher
|
||
| 06.10.2012, 22:43 | ||
|
Пардоньте за некропостинг, но
0) в данном примере можно убрать const, дальше я буду считать, что там просто volatile 1) наиболее приоритетные перегрузки оператора << принимают const char* либо char *, однако они не подходят(volatile T не может неявно привестись к T, где T - какой-либо тип. Для const и const volatile это правило также справедливо.). 2) следующая возможная перегрузка принимает void*, однако указатели, помеченные как const либо volatile не могут неявно привестись к void*. 3) следующая по приоритету перегрузка принимает bool, который и становится окончательным вариантом.
0
|
||
|
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
|
||
| 07.10.2012, 01:16 | ||
|
Добавлено через 4 минуты упс, некропост.
0
|
||
|
|
|
| 07.10.2012, 09:50 | |
|
0
|
|
| 07.10.2012, 09:50 | |
|
Помогаю со студенческими работами здесь
20
Заменить volatile на Thread.MemoryBarrier. Код приведён. Как оптимизировать обращения для чтения к volatile полю класса? int const * const foo(const int* param) const - разъясните значение квалификаторов int\ volatile int \ const int
Что это bool operator== (const CLASS&) const; Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|