![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Fantasist |
|
||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Дык, я про оптимизатор говорю. Понятно, что ты знаешь, а вот оптимизатор нет, поэтому и не оптимизирует такой кусок, если ты ему явно with не указал. Это правда только предположение, почему он так работает. Истинной причины мы не знаем.
В таких случае я обычно пишу:
Потому как обычно такая строчка не одна. Да и with с одной строчкой я очень редко встречал. -------------------- Волны гасят ветер... |
||||||
|
|||||||
| p0s0l |
|
||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Так... Я тут немного покомпилировал и поисследовал...
Да, без with компилируется циклы так, что адрес переменной вычисляется в каждом шаге цикла. НО! Адрес-то вычисляется не по значению переменной, а по значению РЕГИСТРА, в который заносится значение переменной еще до цикла... И как это понимать ? Если ты сказал про многопоточные проги: типа во время цикла может измениться значение этой переменной, или нужно узнать её значение - из-за оптимизатора будет облом, даже без всякого with - как интересно другой поток узнает значение какого-то регистра ? Вот пример того, что я имел в виду:
Тут вместо переменной i Delphi использует регистр edx... Конечно, если сделать переменную i глобальной, то будет все ОК, т.е. в каждом шаге цикла в регистр edx будет загружаться значение переменной i, вычисляться адрес в массиве и заноситься по этому адресу 5... Ну ладно, для многопоточных случаев такие переменные - глобальные. А обычно-то используются локальные переменные - вот еще один наглядный пример "глупости" оптимизатора:
Это получается так:
Fantasist - как ты мне это объяснишь ? Абсурд какой-то... Вместо локальных i и j используются edx и eax -> т.е. подразумевается, что значения этих переменных больше нигде не нужны, поэтому можно засунуть их в регистр -> значит их значения не могут поменяться -> вопрос: почему бы не вынести команду imul перед циклом ? -------------------- С уважением, г-н Посол. |
||||||
|
|||||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Оптимизатор посмотрел на это дело, подумал: что за идиот такой код написал? Вот хрен тебе отимизация - не поможет она тебе. Серьезно. Объяснение этого момента лучше попросить у разработчиков. Оптимизация процесс весьма сложный, и всему есть какие-то пределы в плане анализа. Тут вообще можно в вину компилятору вменить, что он цикл не убрал - не нужен тут цикл вообще (с глобальной переменной, опять же, можно сослаться на многопоточность, но я не думаю, чтобы он и с локальной этот цикл убрал). Так что.... Се ля ви. -------------------- Волны гасят ветер... |
|||
|
||||
| p0s0l |
|
||||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Ладно, почему-то люди всегда могут конкретизировать, а абстрагировать им влом... Я привел пример, который показывает самый глупый случай, когда адрес даже не меняется... Вот тебе с меняющимся адресом:
Компилится так:
ТА ЖЕ САМАЯ история - ничего не поменялось практически, тот же глупый вопрос: почему imul в цикле ? А вот как оптимизируется такое:
Компилится так:
-------------------- С уважением, г-н Посол. |
||||||||||
|
|||||||||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Это как бы шутка, вообще-то, была. Или без смайлика не считается.
Тот же самый ответ (от 20.9.2003, 15:53). Второй абзац, первые три предложения. -------------------- Волны гасят ветер... |
||||
|
|||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Если бы 2 предложения, то согласен, но 3... - т.е. хочешь сказать, что цикл бесполезен ? Интересная логика... Ладно, что тут перебирать одно и тоже, закругляюсь... -------------------- С уважением, г-н Посол. |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Черт! Так и знал, что неправильно посчитают. -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |