Цитата:ЗЗЫ ну и совсем слова идиота - насколько верна догадка, что локальные переменные компилятором стараются быть засунуты в РОН а глобальные в ОЗУ?
Именно так. Только глобальные - они всегда в ОЗУ, а локальные - по возможности в РОН, а если не лезет, то в ОЗУ.
Цитата: Тогда для изменения глобальной переменной лучше в функции присвоить её значение локальной регистровой, сравнивать раз 200 без операций выгрузки-загрузки в ОЗУ и только потом записать в глобальную - в ОЗУ?
Безусловно. Конечно, современные компиляторы стараются избавляться от лишних обращений к памяти, но все равно, человек это лучше - ему виднее в комплексе. Правда, попытки такой оптимизации именно компиляторами ведут к первым граблям. Это типа подсказка
Цитата:Да и слова "uint_fast8_t" наводят на мысль что это указание компилятору использовать для данных переменных "быстрые" 8-битные РОН....
Ну для конкретной платформы можно написать и unsigned char, как собственно и сделано. А вот для портабельности кода без потери производительности для регистровых переменных следует указывать именно типы uint_fastX_t. Приведу развернутое объяснение этого, которое я написал для господина KMG в асе
Цитата:Смысл в том, что процессоры с разрядностью больше m>n обычно неэффективно в регистрах выполняют операции разрядностью n. Требуется лишний код на приведение типов. Посему правильно иметь регистровые переменные той же разрядности, как и регистры. Например, для ARM'ов:
uint8 - 8 бит
uint_fast8 - 32 бита
uint16 - 16 бит
uint_fast16 - 32 бита
uint32 - 32 бита
uint_fast32 - 32 бита
uint64 - 64 бит
uint_fast64 - 64 бита
Понятное дело, что для размещения переменных в памяти оптимально использовать размер не больше нужного, т.е. uint8/uint16 и т.д. А вот в регистрах - uint_fastX.
Потом очень мрачно смотреть на код, писанный в стиле для 8мибитника со сплошными char в коде при компиляции его на, скажем, ARM-архитектуру.
Так что к месту использование таких типов улучшает портабельность исходников на другие архитектуры.
По нынешним временам это актуально даже для большого брата, ибо int в архитектуре x64 остался 32хбитным, а регистры - 64хбитные. Со всеми вытекающими. Так что на большом брате надо тоже использовать uintX_fast_t.
Аналогичный вопрос может возникать при переносе, скажем, с архитектуры MSP (16 бит) как на AVR (8 бит), так и на ARM (32). Обычное бездумное использование int везде где можно на 16тибитных архитектурах при переносе на AVR приведет к перерасходу регистров, а на ARM - может повлечь за собой нежелательные эффекты за счет того, что int там не 16, а 32 разряда.
Цитата:Не, ну понятно желание господина KMG сэкономить время и пожалеть топик Ператрона, но а остальным страждущим и жаждущим познаний тоже хочется!
Вот и я ему то же предлагал. А этот топик жалеть не надо после ссылок на говносайты. Пусть тут будет "школа молодого бойца" вменяемая.