|
|
||||||||||||||||||||||||||||||||||||||||||||||
[Задача] const volatile27.05.2011, 15:53. Показов 16558. Ответов 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; Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|