[ZX]
-
- PREPARE_X_READ - это только альтернатива условной директиве в
хедере. Можно и без него. Да и остальное тоже - как еще один
вариант. Лично я - за инкапсуляцию. - il-2(08.05.2020 16:33)
- Ты x_ptr сделал глобальным, в итоге он не оптимизируется. Если его
сделать статическим и присваивать в хидере -- по крайней мере
оптимизируется и косвенной адресации мы в коде не увидим. И
во-вторых у тебя никто не мешает написать x=!0. И в третьих
проблемы с const на гарвардских архитектурах. В четвертых макрос
сулящий проблемы: я вариант с геттером инлайн-функцией (их умел
даже hitech-C, если кто-то сегодня не умеет, то наверное следует
сменить компилятор) предлагал ниже. - fk0(08.05.2020 16:43)
- Поправил свой пример выше - написал "static int x;" Так секретнее :-) И кстати - указатель на const является
указателем на данные с модификатором "только чтение". Даже в
гарвардовской архитектуре - он не меняет область данных, для этого
надо использовать нестандартные ключевые слова - например как int
__flash *ptr; в IAR-AVR. По моему так... - il-2(08.05.2020 18:05)
- Так всегда обращение через указатель, медленно. Я предлагал указатель сделать static const -- тогда оптимизатор всегда твердо уверен в его значении и может выкинуть (обращаться напрямую к x). Гарвардовская архитектура по-разному сделана у разных компиляторов. У пиков -- по адресу понимает (hitech-c, в рантайме выбирает один из двух вариантов обращения по-указателю) если указатель (если переменная -- сразу знает адрес и генерит нужный код), у KEIL C51 нельзя было мешать const fk0(277 знак., 08.05.2020 19:57)
- Ну то что ты предлагаешь здесь и там уже не соответствует хотелкам
топикстартера. Он конечно хочет странного, но твой вариант к этой
странности не подходит, ибо ты в хедере сразу открываешь полный
доступ к этой "немодифицируемой извне" переменной, а затем зачем-то
предлагаешь какие-то геттеры/сеттеры/статические указатели для
работы с ней. Нафиг они тогда не нужны, можно напрямую в переменную
фигачить. В общем - странные желания порождают странные решения :-) - il-2(08.05.2020 17:45)
- Я имя изменил на _x, т.е. x=!0 не написать. Тут дилемма: с одной стороны хочется скрыть, но с другой, эффективное обращение к переменной (преимущественно чтение) возможно только при прямом знании адреса. Я говорю преимущественно про 8-битные архитектуры, где чтение по-указателю -- тяжелое. Для ARM'ов пофигу (тем более часто там вследствии особенностей будет так или иначе по-указателю: у ARM сложная загрузка адреса, у MIPS выкрутасы в релокацией и позиционно-независимым fk0(41 знак., 08.05.2020 20:03)
- Поправил свой пример выше - написал "static int x;" Так секретнее :-) И кстати - указатель на const является
указателем на данные с модификатором "только чтение". Даже в
гарвардовской архитектуре - он не меняет область данных, для этого
надо использовать нестандартные ключевые слова - например как int
__flash *ptr; в IAR-AVR. По моему так... - il-2(08.05.2020 18:05)
- Ты x_ptr сделал глобальным, в итоге он не оптимизируется. Если его
сделать статическим и присваивать в хидере -- по крайней мере
оптимизируется и косвенной адресации мы в коде не увидим. И
во-вторых у тебя никто не мешает написать x=!0. И в третьих
проблемы с const на гарвардских архитектурах. В четвертых макрос
сулящий проблемы: я вариант с геттером инлайн-функцией (их умел
даже hitech-C, если кто-то сегодня не умеет, то наверное следует
сменить компилятор) предлагал ниже. - fk0(08.05.2020 16:43)
- PREPARE_X_READ - это только альтернатива условной директиве в
хедере. Можно и без него. Да и остальное тоже - как еще один
вариант. Лично я - за инкапсуляцию. - il-2(08.05.2020 16:33)