-
- То есть зависит от левой ноги компилятора? Вот и думай: если ему взбредет в голову что оптимально взять сразу 2 регистра то он может применить LDM? И volatile не поможет? Тогда что, все-таки запрещать прерывания? - Petrovich(04.02.2015 11:30, )
- volatile тут вообще ни с какого бока. Кстати, видел у компиляторов ключики, запрещающие LDM, STM. Ну и по большому счёту компилятор никому не обещает, что не разобьёт доступ к объекту на несколько инструкций. Гарантировать может только ассемблер. - SciFi(04.02.2015 11:35)
- Компилятор так же не обещает, что он не закеширует объект в регистрах, что он не будет считывать из памяти два раза подряд и ещё всякое странное. Для компилятора лишь главное -- чтоб результат вычислений на выходе сходился с ожиданиями fk0(378 знак., 04.02.2015 12:27)
- Думал, что volatile даст указание работать с переменной индивидуально, не привязывая ее загрузку к загрузке другой переменной, даже если они лежали в памяти рядом и должны быть сравнены/сложены/умножены. Спасибо, понял. Буду пока понуждать к Petrovich(13 знак., 04.02.2015 11:52, )
- вообще volatile указывает чтобы компилятор каждый раз когда в исходнике встретится обращение к этой переменной (константе) каждый раз лазил бы в память по её адресу, а не работал через регистры. - Mahagam(04.02.2015 11:55)
- :) Тогда бы у МК, не умеющих делать операции память-память не было бы шансов. Для работы компилятор все равно достает volatile из памяти и кладет в регистры. Обработает и как паинька положит назад. Вот и вопрос - может ли умница компилятор Petrovich(189 знак., 04.02.2015 12:11, )
- почему это не было бы шансов? - Mahagam(04.02.2015 12:32)
- Ну как бы они сделали volatileVal++, если они не умеют ADD Memo,Memo; а брать в регистры Вы им запретили? - Petrovich(04.02.2015 12:47, )
- Ну ё-маё. Он имел в виду кэширование значения переменной в регистре - именно это запрещено. Знаете, что такое кэширование? - SciFi(04.02.2015 12:50)
- Не было там слов про кэширование. Был запрет "работать через регистры". Вот я и спросил - а как быть с МК, которые обрабатывают данные ТОЛЬКО через регистры. - Petrovich(04.02.2015 12:52, )
- а в таких МК количество переменных в коде не может превышать количество регистров у МК, да? )))) - Mahagam(04.02.2015 13:10)
- Не было там слов про кэширование. Был запрет "работать через регистры". Вот я и спросил - а как быть с МК, которые обрабатывают данные ТОЛЬКО через регистры. - Petrovich(04.02.2015 12:52, )
- Ну ё-маё. Он имел в виду кэширование значения переменной в регистре - именно это запрещено. Знаете, что такое кэширование? - SciFi(04.02.2015 12:50)
- Ну как бы они сделали volatileVal++, если они не умеют ADD Memo,Memo; а брать в регистры Вы им запретили? - Petrovich(04.02.2015 12:47, )
- почему это не было бы шансов? - Mahagam(04.02.2015 12:32)
- :) Тогда бы у МК, не умеющих делать операции память-память не было бы шансов. Для работы компилятор все равно достает volatile из памяти и кладет в регистры. Обработает и как паинька положит назад. Вот и вопрос - может ли умница компилятор Petrovich(189 знак., 04.02.2015 12:11, )
- вообще volatile указывает чтобы компилятор каждый раз когда в исходнике встретится обращение к этой переменной (константе) каждый раз лазил бы в память по её адресу, а не работал через регистры. - Mahagam(04.02.2015 11:55)
- volatile тут вообще ни с какого бока. Кстати, видел у компиляторов ключики, запрещающие LDM, STM. Ну и по большому счёту компилятор никому не обещает, что не разобьёт доступ к объекту на несколько инструкций. Гарантировать может только ассемблер. - SciFi(04.02.2015 11:35)
- То есть зависит от левой ноги компилятора? Вот и думай: если ему взбредет в голову что оптимально взять сразу 2 регистра то он может применить LDM? И volatile не поможет? Тогда что, все-таки запрещать прерывания? - Petrovich(04.02.2015 11:30, )