-
- Рекомендую почитать. КМК, ваше предположение скорее относится к
вымышленной истории Vit(1 знак., 17.10.2021 17:22, ссылка)
- Насчет текста по ссылке. Там взят фрагмент кода и к нему привнесена concurrency, для которой требуются особые меры синхронизации. Приплетать в конкурентую среду volatile и основывать на этом контр-пример само по себе ошибочно. Если же отбросить авторские фантазии, то для приведенного фрагмента кода смысл volatile в том чтобы while(ready); читал переменную из памяти всегда (guaranteed ordering) и это корректно. - RxTx(18.10.2021 16:55)
- Моя вымышленная история произошла более 20 лет назад. Т.к. мне
приходилось реализовать все о чем написано выше, то подумалось что
некто сможет извлечь пользу из рассказа о точном действии volatile. - RxTx(18.10.2021 16:42)
- "точное действие"... зато у нас песни хорошие - Vit(18.10.2021 19:28)
- Причем здесь регистры процессора? Чтобы переменная не помещалась в
регистр или в стек используется static. Volatile используется когда
переменная может изменяться в прерывании или при вводе. Ее нельзя
оптимизировать, потому как ее поведение определяется не только
самой программой, а и внешними факторами. - Guest(17.10.2021 00:40, )
- Про static вы не правы. Static, как и extern, а также
"древнеславянский" auto определяют область видимости - scope.
Помещать в регистры и оптимизировать их компилятор может так, как
считает нужным. Costic(60 знак., 17.10.2021 17:06, ссылка, ссылка)
- Ну это же надо так запутаться в элементарном вопросе. Static для
того и введен (и того так называется), чтобы создать аналог
глобальной переменной, но не засорять глобальное пространство имен.
И эта область памяти не может быть ни регистром, ни стеком и не
кучей, т.к. все эти области памяти временные. Линкер обрабатывает
static так же, как и глобальную переменную и аналогично
инициализирует ее при старте программы. Единственное ее отличие от
глобальной в том, что она видима Guest(205 знак., 17.10.2021 20:44, )
- Вы сами запутались и других путаете. Volatile и static - разные и несравнимые вещи. Volatile - type qualifier. Static - storage class. В вашем
тексте только 2 и 4 предложение верны. Ссылку/пруф я давал +
справка Keil'a. - Costic(17.10.2021 21:12)
- И в чем же я не прав, когда утверждаю, что static в отличие auto не
может размещаться в регистре? - Guest(17.10.2021 21:16, )
- Для реализации программы/алгоритма и static, и auto могут
размещаться в регистре (процессора), точнее копии тех значений из
памяти. Хранятся все они в памяти. Тип памяти, видимость, время
существования - разные. Но компилятор уверен, что эта память только под его контролем, если не указать volatile. Costic(93 знак., 17.10.2021 22:18)
- Все операции проводятся в регистрах. Но дело в том, что
auto-переменная в памяти вполне может и не размещаться, если для
п/п регистров процессора достаточно. Именно поэтому при входе в
подпрограмму у auto-переменных значение не определено. Guest(337 знак., 17.10.2021 22:57, )
- Насчёт "все операции проводятся в регистрах" — это опрометчивое заявление. В традиционных CISC, например, есть инструкция "INC (addr)". Что, кстати, добавляет перца компиляторостроителям. Например, можно ли обойтись одной этой инструкцией в этих двух случаях: 1) "int volatile i; i++;" и 2) "int volatile i; int tmp; tmp = i; i = tmp + 1;" ? - SciFi(18.10.2021 09:14)
- У вас каша в голове. Вопрос не в размещении переменной, а в её
использовании. =AlexD=(764 знак., 18.10.2021 08:54)
- Насчет volatile уже разобрались раньше. В данном случае я на
частном примере пояснял, почему auto может размещаться в регистре
даже без размещения в памяти (не учитываем пока стек), а static -
не может. Безотносительно производится оптимизация или нет.
Неполно. Согласен. Оппонент же утверждал, что static определяет
лишь область видимости, а на размещение переменной не влияет. - Guest_1(18.10.2021 10:43, )
- Цитирую себя: "Хранятся все они в памяти". "Лишь область видимости" - это вы так читаете. Costic(121 знак., 18.10.2021 17:23)
- static - разновидность глобальных переменных, только ограничивается
видимость на уровне файла либо функции. В остальном от глобальных
ничем не отличаются. - =AlexD=(18.10.2021 11:10)
- А я про что? Точно такими же словами говорю (см. выше) ;) - Guest_1(18.10.2021 11:22, )
- Для компилятора, который видит все в пределах файла, это может дать возможность для более сильной оптимизации. - AlexBi(18.10.2021 11:21)
- Насчет volatile уже разобрались раньше. В данном случае я на
частном примере пояснял, почему auto может размещаться в регистре
даже без размещения в памяти (не учитываем пока стек), а static -
не может. Безотносительно производится оптимизация или нет.
Неполно. Согласен. Оппонент же утверждал, что static определяет
лишь область видимости, а на размещение переменной не влияет. - Guest_1(18.10.2021 10:43, )
- Все операции проводятся в регистрах. Но дело в том, что
auto-переменная в памяти вполне может и не размещаться, если для
п/п регистров процессора достаточно. Именно поэтому при входе в
подпрограмму у auto-переменных значение не определено. Guest(337 знак., 17.10.2021 22:57, )
- Для реализации программы/алгоритма и static, и auto могут
размещаться в регистре (процессора), точнее копии тех значений из
памяти. Хранятся все они в памяти. Тип памяти, видимость, время
существования - разные. Но компилятор уверен, что эта память только под его контролем, если не указать volatile. Costic(93 знак., 17.10.2021 22:18)
- И в чем же я не прав, когда утверждаю, что static в отличие auto не
может размещаться в регистре? - Guest(17.10.2021 21:16, )
- Вы сами запутались и других путаете. Volatile и static - разные и несравнимые вещи. Volatile - type qualifier. Static - storage class. В вашем
тексте только 2 и 4 предложение верны. Ссылку/пруф я давал +
справка Keil'a. - Costic(17.10.2021 21:12)
- Ну это же надо так запутаться в элементарном вопросе. Static для
того и введен (и того так называется), чтобы создать аналог
глобальной переменной, но не засорять глобальное пространство имен.
И эта область памяти не может быть ни регистром, ни стеком и не
кучей, т.к. все эти области памяти временные. Линкер обрабатывает
static так же, как и глобальную переменную и аналогично
инициализирует ее при старте программы. Единственное ее отличие от
глобальной в том, что она видима Guest(205 знак., 17.10.2021 20:44, )
- Про static вы не правы. Static, как и extern, а также
"древнеславянский" auto определяют область видимости - scope.
Помещать в регистры и оптимизировать их компилятор может так, как
считает нужным. Costic(60 знак., 17.10.2021 17:06, ссылка, ссылка)
- В стандарте написано попроще. И как раз запрещает оптимизацию. Все
операции/чтения записи должны выполнятся без пропусков. - BlackMorda(16.10.2021 20:10)
- Приведите пж-та выдержку стандарта, которая написана попроще. RxTx(210 знак., 16.10.2021 21:53)
- ISO/IEC 9899:1999 (E) BlackMorda(653 знак., 17.10.2021 08:55)
- Не исключаю что более поверхностное описание кому-то звучит более
просто. Кто хочет действительно разобраться - надо изучать что
происходит. - RxTx(18.10.2021 16:58)
- В стандарте C99 про volatile написано чуть побольше, на самом деле. И там тумана напущено, причём, скорее всего, намеренно. Но для нас, мк-водов, смысл именно такой: компилятор обязан сохранять операции чтения и записи volatile-объектов, а также их порядок, в соответствии с правилами "абстрактной машины" (тот самый "запрет на оптимизацию"). - SciFi(18.10.2021 17:03)
- Не исключаю что более поверхностное описание кому-то звучит более
просто. Кто хочет действительно разобраться - надо изучать что
происходит. - RxTx(18.10.2021 16:58)
- ISO/IEC 9899:1999 (E) BlackMorda(653 знак., 17.10.2021 08:55)
- Приведите пж-та выдержку стандарта, которая написана попроще. RxTx(210 знак., 16.10.2021 21:53)
- Рекомендую почитать. КМК, ваше предположение скорее относится к
вымышленной истории Vit(1 знак., 17.10.2021 17:22, ссылка)