Перейти к содержанию
    

IAR 3.10C

Вот небольшой фрагмент кода:

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. Поэтому вопрос: в какой степени компилятор наплевательски относится к написанному коду при оптимизациях? Как с этим обстоят дела в более поздних версиях компилятора. Я так полагаю, что не стоит полагаться на оптимизацию компилятора, надо самому грамотно писать программу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну прально

ktmp|= ((PultFlag&(0x01<<pult)))?(1<<pult):0;

ktmp=0;

результата использования ktmp нет, зачем её вычислять ваще? Оптимизаццыя то по скорости! ;О) В других оптимизаццыях компилер предполагает, что это, мобуть, какая-то задержка калиброванная ;О) и не торгает. А при макс скорости он её таво...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только хотел ответить, уже опередили. Я тоже очень грешил на компилятор, когда начал переходить на C IAR (закрытая мною тема про повторный вызов функции), а оказывается, алгоритм надо лучше продумывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот небольшой фрагмент кода:

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. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока была только одна крутая хрень от компилятора.

Человек сделал следующее:

if чегото

if чегото2

продолжение проги

 

чегото и чегото2 не исчерпывали все возможные значения в условии, то есть были операции которые надо делать в любом случии.

 

прога работала не верно. Он залез в дебагер и увидел:

if чегото

else чегото2

 

сейчас он в отпуске кайфует,но если очень интересен код, могу попробовать связаться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Pultflag во истину volatile был объявлен изначально. Вот поэтому и возник вопрос: куда он этот код девал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте использовать 3.20D

в 3.10 были проблемы с volatile

достаточно просто заменить exeшник компилера

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как насчет 4.11А? Он в этом отношении лучше своих предшественников или такой же? И вообще, стоит ли на него переходить или ограничиться 3.хх?

 

Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит.

Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает.

 

 

Я вот решил пока на 3.20D остаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код сам по себе ошибочный.

Компилятор старый.

Зато какое пафосное название темы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код сам по себе ошибочный.

Компилятор старый.

Зато какое пафосное название темы!

Оговорюсь: фрагмент кода, который в программе в данной последовательности не используется. Здесь приведен фрагмент, который я написал, чтобы поглядеть в отладчике что же происходит. Слова благодарности dxp, который на двух пальцах объяснил, как все это воспринимает компилятор(что собственно и хотелось услышать). Версия компилятора - абсолютно не при чем, если она не содержит в себе ошибок. И менее всего я уделял названию темы...

 

Хороший компилер, многие сложные врыажения там где умножение есть лучше компилит.

Но вот часть оптимизации похуже стала например если константа или указатель (константный) много раз испольуется 3.20D его в регистрах хранил а 4.11 какждый раз загружает.

 

 

Я вот решил пока на 3.20D остаться.

Где добыть можно 3.20D?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где добыть можно 3.20D?

Зайти по ссылке, далее - Product updates, далее - Version 3.20 и далее выбрать C или CPP обновлять.

Лечится уникраком.

Но перед этим надо снести и поставить заново непролеченную версию 3.20C.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...