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

Странности при оптимизации

Угу, и у тебя тоже :) не все включено, ибо еще, если мне не изменяет склероз, должено быть что-то типа Еxpression is constant.
Абижяешь, начальник! Я их никогда не отключаю. Нет предупреждения ни в С ни в С++ режиме. ИАР для ARM, 4.30
Вобще-то сие однозначно со всех точек зрения пишется так:
Согласен, так и пишу. Но тут надо было повторить исходные условия эксперимента.

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


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

Абижяешь, начальник! Я их никогда не отключаю. Нет предупреждения ни в С ни в С++ режиме.

Я же не говорил про отключение я говорил про "не все включено" :). Ой, а что у меня это, если написать while(1) :

   IAR ARM ANSI C/C++ Compiler .....
D:\ARM_WORK\COMMON\LPC2000\console.c(356) : Remark[Pe236]: controlling expression is constant

Просто в IAR по умолчанию ремарки отключены :( надо включать, тем более, что под remark в IAR попадают и такие суровые приколы, как

Remark[Pe193]: zero used for undefined preprocessing identifier

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


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

Не во всех компиляторах. В avr-gcc вызов линкера с опцией --relax приводит к замене пар call/ret на jmp, а jmp (там, где длина перехода позволяет) - на rjmp. Это вполне себе оптимизация и занимается ей именно линкер.
Thnx, не знал, добавлю в копилку :beer: Но по сравнению с тем, что способен сделать компилятор - это всетаки 'не оптимизация' B) Оптимизации такого уровня способен делать любой компонент в цепочке компиляции, например в Sun'овском ассемблере он мог делать inline подстановки специальных функций (они были описанны в специальных файлах) вместо их вызовов

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


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

Вобще-то сие однозначно со всех точек зрения пишется так:

 for(;; )  { .... }

А есть разница? :)

while(1) { .... }

По-моему нет.

В справке к Hi-Tech C они предлагают для бесконечного цикла for(;;) { .... }

При каком-то кол-ве циклов внутри цикла for{ for { for { for {}}}}

компилятор вешается поэтому приходится комбинировать for... while... if... и т.д.

В IAR пока не смотрел. Вроде таких проблем не было.

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


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

А есть разница? :)

Разумеется. Если for( ; ; ) есть прямое и безусловно однозначное указание компилятору изобразить вечный цикл, то while(1) есть указание крутиться и слушать пока рак на горе свистнет. Что не есть одно и то-же. Хотя сколь-нибудь приличный оптимизирующий компилятор знакомый с русским фольклером и анатомическим строением ракообразных :) тоже сделает безусловный вечный цикл. Ну и, естественно, хороший компилятор при этом обязан предупредить - ты чего тут барин загадки загадываешь? Точно этого хотел, али опосля вчерашнего того.....

При каком-то кол-ве циклов внутри цикла for{ for { for { for {}}}}

компилятор вешается поэтому приходится комбинировать for... while... if... и т.д.

Опять :( ужасы.

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


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

Бьярн Страустрап, 1995 г. Введение в язык С++. Глава 3 Выражения и операторы :

 

" Странная запись for(;;) - это стандартный способ задать бесконечный цикл; можно произносить это как "навсегда". Это вырожденная форма оператора for; альтернатива - while(1)."

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


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

Разумеется. Если for( ; ; ) есть прямое и безусловно однозначное указание компилятору изобразить вечный цикл, то while(1) есть указание крутиться и слушать пока рак на горе свистнет. Что не есть одно и то-же. Хотя сколь-нибудь приличный оптимизирующий компилятор знакомый с русским фольклером и анатомическим строением ракообразных :) тоже сделает безусловный вечный цикл. Ну и, естественно, хороший компилятор при этом обязан предупредить - ты чего тут барин загадки загадываешь? Точно этого хотел, али опосля вчерашнего того.....

Опять :( ужасы.

Ну я бы так не сказал: если в for(;;) нет условия, это может быть ошибкой, а for(;1;) тоже, что и while(1)

и раз уж так, то while() { .... } должно работать так же как и for(;;) ?

Т.е. в for не надо вставлять условие ??? а в while надо ??? Правильным будет всегда с условием. Это точно не противоречит стандарту С. А то, что как вы сказали "оптимизирующий компилятор знакомый с русским фольклором" - это скорее исключение, а не правило. Поэтому и обидно... :( Если я буду всем советовать for(;;) то это не будет правильно. Что for(;;) что while() - Варнинги обеспечены по любому. А хотелось бы писать правильно. И запись for(;1;) будет правильней.

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


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

Что for(;;) что while() - Варнинги обеспечены по любому.

:) нет. Для этого просто надо знать язык - по стандарту ВСЕ ТРИ expression у for() ОПЦИОНАЛЬНЫ. В отличии от while() у которого один, но ОБЯЗАТЕЛЬНЫЙ.

При этом оговаривается, что отсутствующее второе выражение у for() заменяется ненулевой константой.

А хотелось бы писать правильно. И запись for(;1;) будет правильней.

Не, глупее :( и при этом вменяемый компилятор обязан предупредить, как и в случае с while( 1 ) чем-нибудь типа 'controlling expression is constant'. Кстати, а почему 1, а не 666??? :) глупость, короче, если и писать глупости, то хоть без конкретики - while( TRUE )

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


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

Уважаемый гуру! 1 - она и в Африке 1. А что такое TRUE? Макро, которое может и не быть определено или ты забыл подключить нужный .h файл. А если определено, то как 1.

 

Как написано у Кернигана & Ритчи "Какой цикл выбрать: while или for - это дело вкуса". Нельзя считать, что миллионы программистов, исповедующие другой стиль написания программ, пишут глупости (не скромно это, как-то).

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


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

Как написано...

Вы слишком много читаете, настолько много, что смысл прочитанного от Вас ускользает а в памяти остаются только культовые имена. Не найдете Вы в этой классической книге ни одого while( 1 ). А for( ; ; ) найдете, ибо автор 'C' отличался хорошим вкусом. А Ваша читата просто вырвана из другого, не связанного с организацией бесконечных циклов контекста.

 

А что такое TRUE?

Общепринятое, максимально читабельное и соответствующее сущности значение.

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


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

А не пора ли уже прекратить "религиозные" споры? Если результат компиляции одинаков, то стилистика пускай на совести программиста останется. Конечно нет пределов совершенству и самосовершенствованию, но и насильно в свою "религию" тоже обращать не стоит. Мнения прозвучали, теперь каждый может сделать выводы. Только уже "молча". Чтобы до размахивания авторитетами и до оскорблений дело не дошло.

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


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

...

Оптимизации такого уровня способен делать любой компонент в цепочке компиляции, например в Sun'овском ассемблере он мог делать inline подстановки специальных функций (они были описанны в специальных файлах) вместо их вызовов

Это называется макрос и есть в любом ассемблере, оптимизацией это называть сложно. Тогда уж всё, что позволяет программу писать не прямо в машинных кодах, есть оптимизация :)

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


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

А не пора ли уже прекратить "религиозные" споры? Если результат компиляции одинаков

Результат разный - в случае for( 1 ) приличными компиляторами выдается предупреждение, на которое можно, конечно, наплевать, что сделает компилятор при отключенной оптимизации - тоже на его совести. Можете считать это "религиозным" убеждением, наплевательское отношение к делу, равно, как и безграмотная писанина, мне не по душе. Впрочем в данном случае я смог высказаться полностью, более мне добавить нечего, а далее могущий понять да поймет - продолжать не буду.

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


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

Это называется макрос и есть в любом ассемблере, оптимизацией это называть сложно. Тогда уж всё, что позволяет программу писать не прямо в машинных кодах, есть оптимизация :)
Это не есть макрос - он заменяет не макровызов (по ID макроса), а обычную ассемблерную комманду call

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


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

в случае for( 1 ) приличными компиляторами выдается предупреждение, на которое можно, конечно, наплевать, что сделает компилятор при отключенной оптимизации - тоже на его совести.
Хотя я и не имел в виду именно эту конструкцию, но и ее тоже проверил. В последних версиях IAR не выдает ни warning, ни remark ни на while(1), ни на for(;1;) . По-вашему фирма IAR "прогнулась" под привычки программистов? Как-то не соотносится это (желание "прогнуться") с введением той же MISRA C в их компиляторы, не находите?

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...