|
Непонятное значение, PPC405 (XPS 9.2) |
|
|
|
Jul 24 2009, 13:31
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(scifi @ Jul 24 2009, 18:54)  А я думаю иначе :-) В стандарте написано: "If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate." Понять это можно по-разному. Но если это понимать так, что у однобайтовых аргументов функции при входе в функцию обязательно надо отсекать лишние биты, то это приведёт к менее компактному и более медленному коду. Кому это надо? Тому разгильдяю, который не хочет инициализировать переменные? Я думаю, не следует идти у него на поводу. Понимать это надо так, как написано. Значение неопределено. Но в том же стандарте гарантируется, что значения переменной char находятся в диапазоне CHAR_MIN...CHAR_MAX. Если компилятор, вне зависимости от инициализированности переменной, этого не обеспечивает, это - кривой компилятор. Как он это делает - это его личное дело. Но делать это он обязан. Цитата(Rst7 @ Jul 24 2009, 18:59)  Я именно так и написал. Потом, правда, зачеркнул, решил, что сильно грубо  Кстати, подход IAR-а не всегда выиграет. По идее, он должен отсекать лишние биты при каждой записи в переменную. Можно представить ситуации, когда такой подход проиграет отсечению при чтении. Не говоря уж о том, что отсечение при чтении надёжнее.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 24 2009, 13:36
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Кстати, подход IAR-а не всегда выиграет. По идее, он должен отсекать лишние биты при каждой записи в переменную. Можно представить ситуации, когда такой подход проиграет отсечению при чтении. При записи в ОЗУ отсечение происходит автоматически. Кстати, как и при чтении. При регистровых операциях оптимизатор точно выбросит лишние отсечения, которые "не пляшут рояли". Цитата Можно представить ситуации, когда такой подход проиграет отсечению при чтении. Очень гипотетическая ситуация, в связи с тем, что количество записей обычно меньше количества чтений. Цитата Не говоря уж о том, что отсечение при чтении надёжнее. Не надо уподобляться Дохтуру. Он тоже тут измышлял, в каких битах надежнее данные хранятся... Забанили нафиг
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jul 24 2009, 13:52
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Rst7 @ Jul 24 2009, 19:36)  При записи в ОЗУ отсечение происходит автоматически. Кстати, как и при чтении. При регистровых операциях оптимизатор точно выбросит лишние отсечения, которые "не пляшут рояли". Лишь на тех архитектурах, где есть побайтовый доступ к ОЗУ, не правда ли?  Цитата Очень гипотетическая ситуация, в связи с тем, что количество записей обычно меньше количества чтений. Согласен, потому и написал "можно представить", а не "часто встречаются"  Цитата Не надо уподобляться Дохтуру. Он тоже тут измышлял, в каких битах надежнее данные хранятся... Забанили нафиг  Ну, я надеюсь, что я немного более вменяем  Я имею в виду, что отсечение при чтении защитит от ситуаций, когда хитрый программист записал что-то в переменную через указатель. Что до меня лично, я бы не прочь иметь в ГЦЦ ключик, включающий такую оптимизацию
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 25 2009, 18:16
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Лишь на тех архитектурах, где есть побайтовый доступ к ОЗУ, не правда ли? Вы много знаете архитектур с отсутствием такового? Цитата Я имею в виду, что отсечение при чтении защитит от ситуаций, когда хитрый программист записал что-то в переменную через указатель. Посмотрите, каким образом компилятор извлекает, скажем, байтовую переменную из ОЗУ в 32хбитных архитектурах. Например, для ARM он пользуется LDRB, что приводит к автоматическом маскированию старших бит. На PPC есть аналогичная команда LBZ. Вот я уже правда не помню (давно не брал я в руки шашек), на большом индейце всех времен и народов (680x0) команда загрузки байта из ОЗУ в регистр типа move.b (Ax),Dy кажется не приводит к прочистке старших бит, посему там надо использовать ext.b Dy после загрузки. Цитата Дык! Но и в неположенные старшие мальца попало И если компилятор работает исходя из предположения, что там нули, то будет ой Да откуда же возьмутся после загрузки с расширением (одной командой в ARM или PPC, или парой в 680x0) там не нули?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|