Sergio66 0 24 марта, 2005 Опубликовано 24 марта, 2005 · Жалоба Доброго дня! Подскажите пожалуйста, как добиться от этого зверя корректной оптимизации? Что происходит - блок типа: while(!(Key == OK)) { ...} полностью выбрасывается компиллятором, т.к. переменная Key модифицируется в другом модуле, а тут объявлена, как external. ОК - константа. помогает только полное отключение оптимизации. Может быть есть какая-то хитрость, чтобы обмануть хитрого оптимизатора? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 24 марта, 2005 Опубликовано 24 марта, 2005 · Жалоба надо описать как volatile extern volatile тип K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ShiphT 0 25 марта, 2005 Опубликовано 25 марта, 2005 · Жалоба Как сказал KRS - надо объявить переменную Key как volatile - это говорит компилятору, что эта переменная может изменяться "неведомым" ему способом, например в другом модуле/прерывании. И еще, может проще написать while(Key != OK) { ...} А то как-то сразу без поллитры не понять что хочешь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergio66 0 25 марта, 2005 Опубликовано 25 марта, 2005 · Жалоба надо описать как volatile extern volatile тип K <{POST_SNAPBACK}> А что, компилятор тоже без пол-литры не может понять, чего я хочу, и потому выбрасывает весь блок? Да, кстати, действительно, объявление volatile решило проблему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 25 марта, 2005 Опубликовано 25 марта, 2005 · Жалоба надо описать как volatile extern volatile тип K <{POST_SNAPBACK}> А что, компилятор тоже без пол-литры не может понять, чего я хочу, и потому выбрасывает весь блок? Да, кстати, действительно, объявление volatile решило проблему. <{POST_SNAPBACK}> Компилятор как раз делает правильно! так и должно быть. Вот если бы вы вызывали внутри цикла функцию тогда все ок! а если в прерывании переменная меняется она должна быть volatile А весь цикл выбросился скорее из-за того, что начальное значение перед ним присваивалось, а потом функции не вызывались и модификации не было. Иначе бы всетки остался бесконечный цикл Например A=0 while (A) { .... } выбрасыватеся A=1 while (A) { .... } делается бесконечным но вот если вызвать не инлайн функцию A=0 f(); while (A) { f(); .... } то тогда выкидывать ничего компилер не будет или надо объявлять volatile Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться