-
- Пример "как не надо делать" (структура кольцевого буфера) без
собственно кода, работающего с этой структурой - мимо кассы.
Завывания про "lack of reentrancy" и отсутствующих критических
секциях удивляют. Указанная структура при правильном употреблении
как раз и не требует критических секций. А вот нужен ли там
volatile - сильно зависит от использования. - LightElf(18.10.2021 01:42)
- Да там автор гхмм... "очень специфичен". Он а) просто не понимает почему там volatile (потому что существует код, который лочится на постоянной вычитке двух этих переменных) б) Он прикладывает полученные им знания о concurrency в многоядерных "больших" x86/64 системах к однопоточному коду на микроконтроллере (с прерываниями), а так делать не стоит, нужно знать где ты пишешь и что допустимо в данной среде, а чего следует опасаться. в) достаточно RxTx(83 знак., 18.10.2021 17:06)
- volatile древняя вещь, потребность в ней возникла почти сразу же
при создании системного языка. Этот атрибут ставится для того чтобы
кодогенератор не распределял под переменную регистр процессора. Не
"не проводил оптимизацию", бла-бла-бла, а чтобы автоматом не
распределял переменную в регистр процессора. Это то как надо
понимать volatile а не ‘it can change outside of what the compiler
might assume‘. Хотя последнее конечно верно, но это уже следствие.
При разработке RxTx(743 знак., 16.10.2021 20:02)
- Рекомендую почитать. КМК, ваше предположение скорее относится к
вымышленной истории 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, ссылка)
- Спасибо! Статья, на которую эта ссылается. Nine ways to break your
systems code using volatile Evgeny_CD(1 знак., 16.10.2021 19:03 - 19:13, ссылка)
- В целом вообще интересный сайт Evgeny_CD(1 знак., 16.10.2021 19:08, ссылка)
- Пример "как не надо делать" (структура кольцевого буфера) без
собственно кода, работающего с этой структурой - мимо кассы.
Завывания про "lack of reentrancy" и отсутствующих критических
секциях удивляют. Указанная структура при правильном употреблении
как раз и не требует критических секций. А вот нужен ли там
volatile - сильно зависит от использования. - LightElf(18.10.2021 01:42)