-
- все компиляторы не обязаны производить максимальную оптимизацию. Каждый оптимизирует по своему. Но компилятор имеет полное право удалять такой код при оптимизации. Это соответствует стандарту. - 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)