-
- Попробовал - результат тот-же самый, компилятор полностью удаляет код, вместе с объектом указателя, помеченного как volatile. См. скриншот. Дальнейшие изыскания предлагаю проводить самостоятельно. sladkoejka(06.07.2018 15:21)
- Вы попробовали не тот код, который я написал. Зачем так делать? Ну и, согласно информации по ссылке, это таки вражеский компилятор. SciFi(726 знак., 06.07.2018 15:36, ссылка)
- В вашем примере происходит модификация данных помеченных как volatile. Компилятор в этом случае не может быть уверен, что эту модификацию данных никто не увидит и она ни на что не повлияет. Поэтому код удалять не будет. sladkoejka(06.07.2018 15:48 - 15:53)
- Как пример, чтение внешней памяти может использоваться для сброса сторожа - замешивается на дешифраторе адрес и строб RD, а с выхода получаем сигнал сброса. Если указатель на volatile, то компилятор не должен оптимизировать обращение. Хотя Vit(261 знак., 06.07.2018 16:24)
- тут тоже согласен, для контроллеров это критично, поэтому даже чтение через volatile указатель удалять не стоит. Однако если volatile помечена локальная переменная, не являющаяся указателем, то её можно удалять. Т.к. хранится локальная переменная sladkoejka(95 знак., 06.07.2018 18:14)
- тут тоже согласен, для контроллеров это критично, поэтому даже чтение через volatile указатель удалять не стоит. Однако если volatile помечена локальная переменная, не являющаяся указателем, то её можно удалять. Т.к. хранится локальная переменная sladkoejka(95 знак., 06.07.2018 18:14)
- Дык в этом весь смысл и есть - отключается оптимизация обращения к данным помеченным как volatile, если же к ним обращения нет, то код вполне может выпиливаться. - =AlexD=(06.07.2018 16:01)
- Как пример, чтение внешней памяти может использоваться для сброса сторожа - замешивается на дешифраторе адрес и строб RD, а с выхода получаем сигнал сброса. Если указатель на volatile, то компилятор не должен оптимизировать обращение. Хотя Vit(261 знак., 06.07.2018 16:24)
- В вашем примере происходит модификация данных помеченных как volatile. Компилятор в этом случае не может быть уверен, что эту модификацию данных никто не увидит и она ни на что не повлияет. Поэтому код удалять не будет. sladkoejka(06.07.2018 15:48 - 15:53)
- Вот в другом компиляторе ничего не удаляется даже в вашем первом примере Bhg2(31 знак., 06.07.2018 15:26, ссылка)
- все компиляторы не обязаны производить максимальную оптимизацию. Каждый оптимизирует по своему. Но компилятор имеет полное право удалять такой код при оптимизации. Это соответствует стандарту. - sladkoejka(06.07.2018 15:28)
- Кстати, еще есть небольшое уточнение : Bhg2(345 знак., 06.07.2018 16:04)
- volatile указатель - это для компилятора данные. Инициализация такого указателя требует модификации данных. А если указатель помечен как volatile, то компилятор ограничен в выводах может ли такая модификация на чтото повлиять или не может. Поэтому sladkoejka(430 знак., 06.07.2018 16:30)
- С точки зрения даже абстрактной машины, локальная переменная - это переменная в памяти, а не в регистре. Нет никаких таких регистров в языке Си. А volatile обозначает именно внешние побочные эффекты в памяти. Всё, финита. Никакие =AlexD=(76 знак., 06.07.2018 16:46)
- В порядке уточнения. Переменные могут быть размещены в регистрах, для этого существует специальный квалификатор класса памяти - register. Только по-моему, современные компиляторы его игнорируют. Или нет? - Bill(06.07.2018 18:20)
- это просто рекомендация компилятору хранить переменную в регистре. Компилятор может её не придерживаться. - sladkoejka(06.07.2018 18:29)
- Соглашусь, но это действительно только при условии, что код модифицирует данные данные через volatile указатель. Через указатель можно изменить любую ячейку памяти, которая доступна другому коду. А если не модифицирует, то на данные никак не sladkoejka(40 знак., 06.07.2018 18:03 - 18:11)
- В порядке уточнения. Переменные могут быть размещены в регистрах, для этого существует специальный квалификатор класса памяти - register. Только по-моему, современные компиляторы его игнорируют. Или нет? - Bill(06.07.2018 18:20)
- С точки зрения даже абстрактной машины, локальная переменная - это переменная в памяти, а не в регистре. Нет никаких таких регистров в языке Си. А volatile обозначает именно внешние побочные эффекты в памяти. Всё, финита. Никакие =AlexD=(76 знак., 06.07.2018 16:46)
- volatile указатель - это для компилятора данные. Инициализация такого указателя требует модификации данных. А если указатель помечен как volatile, то компилятор ограничен в выводах может ли такая модификация на чтото повлиять или не может. Поэтому sladkoejka(430 знак., 06.07.2018 16:30)
- Строго говоря, цитате из стандарта не соответствует. SciFi подметил верно. Но здравому смыслу соответствует. Я за такую оптимизацию. Но тут нужно быть осторожным, это отступление от буквы стандарта. Огромное спасибо за примеры! - Nikolay_Po(06.07.2018 15:33)
- А в чём собственно несоответствие? Я считаю все соответствует. В цитате оговаривается случай, когда переменная может быть кем-то модифицирована и это может привести к изменению наблюдаемого поведения. В данном-же случае, даже если ктото изменит sladkoejka(39 знак., 06.07.2018 15:41)
- Согласен, что в стандарте слишком кратко сказано. Тема приведения к volatile не раскрыта. Есть, однако ещё один официальный документ "обоснование", там эта тема затрагивается, и яр нарушает то, что там написано. Впрочем, они могут притвориться SciFi(67 знак., 06.07.2018 16:12, ссылка)
- Здесь Nikolay_Po(217 знак., 06.07.2018 15:55)
- А в чём собственно несоответствие? Я считаю все соответствует. В цитате оговаривается случай, когда переменная может быть кем-то модифицирована и это может привести к изменению наблюдаемого поведения. В данном-же случае, даже если ктото изменит sladkoejka(39 знак., 06.07.2018 15:41)
- Кстати, еще есть небольшое уточнение : Bhg2(345 знак., 06.07.2018 16:04)
- все компиляторы не обязаны производить максимальную оптимизацию. Каждый оптимизирует по своему. Но компилятор имеет полное право удалять такой код при оптимизации. Это соответствует стандарту. - sladkoejka(06.07.2018 15:28)
- Вы попробовали не тот код, который я написал. Зачем так делать? Ну и, согласно информации по ссылке, это таки вражеский компилятор. SciFi(726 знак., 06.07.2018 15:36, ссылка)
- Попробовал - результат тот-же самый, компилятор полностью удаляет код, вместе с объектом указателя, помеченного как volatile. См. скриншот. Дальнейшие изыскания предлагаю проводить самостоятельно. sladkoejka(06.07.2018 15:21)