KSN 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Вот небольшой фрагмент кода: ktmp=0; PultFlag=4; for(pult=0;pult<3;pult++) ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0; ktmp=0; PultFlag=5; for(pult=0;pult<3;pult++) ktmp|= ((PultFlag>>pult)&0x01)?(1<<pult):0; Если уровень оптимизации по скорости минимален или вооще нет, то все хорошо, но как только делаю уровень оптимизации High, то в первом цикле перестает вычисляться ktmp. Поэтому вопрос: в какой степени компилятор наплевательски относится к написанному коду при оптимизациях? Как с этим обстоят дела в более поздних версиях компилятора. Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Ну прально ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0; ktmp=0; результата использования ktmp нет, зачем её вычислять ваще? Оптимизаццыя то по скорости! ;О) В других оптимизаццыях компилер предполагает, что это, мобуть, какая-то задержка калиброванная ;О) и не торгает. А при макс скорости он её таво... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GeorgeV 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Только хотел ответить, уже опередили. Я тоже очень грешил на компилятор, когда начал переходить на C IAR (закрытая мною тема про повторный вызов функции), а оказывается, алгоритм надо лучше продумывать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Вот небольшой фрагмент кода: ktmp=0; PultFlag=4; for(pult=0;pult<3;pult++) ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0; ktmp=0; PultFlag=5; for(pult=0;pult<3;pult++) ktmp|= ((PultFlag>>pult)&0x01)?(1<<pult):0; Дык. После первого цикла значение ktmp не используется. Более того, сразу после этого ему конкретно присваивается 0. С точки зрения компилятора и здравого смысла работа, произведенная в первом цикле сделана впустую. И оптимизатор совершенно справедливо удаляет этот ненужный код, уменьшая размер программы и увеличивая скорость ее работы. В этом весь смысл оптимизации и состоит. Если Вам надо проследить за значениями и подавить оптимизацию, то объявите ktmp как volatile. Так часто делают при отладке, когда надо отследить промежуточные значения. В этом случае компилятор не будет ничего оптимизировать в части этой переменной. Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу. Истину глаголите. :) volatile. :) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Пока была только одна крутая хрень от компилятора. Человек сделал следующее: if чегото if чегото2 продолжение проги чегото и чегото2 не исчерпывали все возможные значения в условии, то есть были операции которые надо делать в любом случии. прога работала не верно. Он залез в дебагер и увидел: if чегото else чегото2 сейчас он в отпуске кайфует,но если очень интересен код, могу попробовать связаться Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KSN 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Pultflag во истину volatile был объявлен изначально. Вот поэтому и возник вопрос: куда он этот код девал? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Попробуйте использовать 3.20D в 3.10 были проблемы с volatile достаточно просто заменить exeшник компилера Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KSN 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх? Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит. Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает. Я вот решил пока на 3.20D остаться. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Код сам по себе ошибочный. Компилятор старый. Зато какое пафосное название темы! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KSN 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Код сам по себе ошибочный. Компилятор старый. Зато какое пафосное название темы! Оговорюсь: фрагмент кода, который в программе в данной последовательности не используется. Здесь приведен фрагмент, который я написал, чтобы поглядеть в отладчике что же происходит. Слова благодарности dxp, который на двух пальцах объяснил, как все это воспринимает компилятор(что собственно и хотелось услышать). Версия компилятора - абсолютно не при чем, если она не содержит в себе ошибок. И менее всего я уделял названию темы... Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит. Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает. Я вот решил пока на 3.20D остаться. Где добыть можно 3.20D? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 9 декабря, 2005 Опубликовано 9 декабря, 2005 · Жалоба Где добыть можно 3.20D? Зайти по ссылке, далее - Product updates, далее - Version 3.20 и далее выбрать C или CPP обновлять. Лечится уникраком. Но перед этим надо снести и поставить заново непролеченную версию 3.20C. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KSN 0 10 декабря, 2005 Опубликовано 10 декабря, 2005 · Жалоба Спасибо большое! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться