|
|
  |
Странности при оптимизации |
|
|
|
Dec 25 2008, 23:15
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ Dec 26 2008, 00:50)  Угу, и у тебя тоже  не все включено, ибо еще, если мне не изменяет склероз, должено быть что-то типа Еxpression is constant. Абижяешь, начальник! Я их никогда не отключаю. Нет предупреждения ни в С ни в С++ режиме. ИАР для ARM, 4.30 Цитата(zltigo @ Dec 26 2008, 00:50)  Вобще-то сие однозначно со всех точек зрения пишется так: Согласен, так и пишу. Но тут надо было повторить исходные условия эксперимента.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 26 2008, 08:07
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Сергей Борщ @ Dec 26 2008, 02:15)  Абижяешь, начальник! Я их никогда не отключаю. Нет предупреждения ни в С ни в С++ режиме. Я же не говорил про отключение я говорил про "не все включено"  . Ой, а что у меня это, если написать 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
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 26 2008, 12:42
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380

|
Цитата(zltigo @ Dec 26 2008, 01:50)  Вобще-то сие однозначно со всех точек зрения пишется так: Код for(;; ) { .... } А есть разница?  Код while(1) { .... } По-моему нет. В справке к Hi-Tech C они предлагают для бесконечного цикла for(;;) { .... } При каком-то кол-ве циклов внутри цикла for{ for { for { for {}}}} компилятор вешается поэтому приходится комбинировать for... while... if... и т.д. В IAR пока не смотрел. Вроде таких проблем не было.
|
|
|
|
|
Dec 26 2008, 13:39
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(DenisIV @ Dec 26 2008, 15:42)  А есть разница?  Разумеется. Если for( ; ; ) есть прямое и безусловно однозначное указание компилятору изобразить вечный цикл, то while(1) есть указание крутиться и слушать пока рак на горе свистнет. Что не есть одно и то-же. Хотя сколь-нибудь приличный оптимизирующий компилятор знакомый с русским фольклером и анатомическим строением ракообразных  тоже сделает безусловный вечный цикл. Ну и, естественно, хороший компилятор при этом обязан предупредить - ты чего тут барин загадки загадываешь? Точно этого хотел, али опосля вчерашнего того..... Цитата(DenisIV @ Dec 26 2008, 15:42)  При каком-то кол-ве циклов внутри цикла for{ for { for { for {}}}} компилятор вешается поэтому приходится комбинировать for... while... if... и т.д. Опять  ужасы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 26 2008, 16:26
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380

|
Цитата(zltigo @ Dec 26 2008, 16:39)  Разумеется. Если for( ; ; ) есть прямое и безусловно однозначное указание компилятору изобразить вечный цикл, то while(1) есть указание крутиться и слушать пока рак на горе свистнет. Что не есть одно и то-же. Хотя сколь-нибудь приличный оптимизирующий компилятор знакомый с русским фольклером и анатомическим строением ракообразных  тоже сделает безусловный вечный цикл. Ну и, естественно, хороший компилятор при этом обязан предупредить - ты чего тут барин загадки загадываешь? Точно этого хотел, али опосля вчерашнего того..... Опять  ужасы. Ну я бы так не сказал: если в for(;;) нет условия, это может быть ошибкой, а for(;1;) тоже, что и while(1) и раз уж так, то while() { .... } должно работать так же как и for(;;) ? Т.е. в for не надо вставлять условие ??? а в while надо ??? Правильным будет всегда с условием. Это точно не противоречит стандарту С. А то, что как вы сказали "оптимизирующий компилятор знакомый с русским фольклором" - это скорее исключение, а не правило. Поэтому и обидно...  Если я буду всем советовать for(;;) то это не будет правильно. Что for(;;) что while() - Варнинги обеспечены по любому. А хотелось бы писать правильно. И запись for(;1;) будет правильней.
|
|
|
|
|
Dec 26 2008, 16:41
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(DenisIV @ Dec 26 2008, 19:26)  Что for(;;) что while() - Варнинги обеспечены по любому.  нет. Для этого просто надо знать язык - по стандарту ВСЕ ТРИ expression у for() ОПЦИОНАЛЬНЫ. В отличии от while() у которого один, но ОБЯЗАТЕЛЬНЫЙ. При этом оговаривается, что отсутствующее второе выражение у for() заменяется ненулевой константой. Цитата А хотелось бы писать правильно. И запись for(;1;) будет правильней. Не, глупее  и при этом вменяемый компилятор обязан предупредить, как и в случае с while( 1 ) чем-нибудь типа 'controlling expression is constant'. Кстати, а почему 1, а не 666???  глупость, короче, если и писать глупости, то хоть без конкретики - while( TRUE )
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 26 2008, 23:10
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sergeeff @ Dec 26 2008, 23:02)  Как написано... Вы слишком много читаете, настолько много, что смысл прочитанного от Вас ускользает а в памяти остаются только культовые имена. Не найдете Вы в этой классической книге ни одого while( 1 ). А for( ; ; ) найдете, ибо автор 'C' отличался хорошим вкусом. А Ваша читата просто вырвана из другого, не связанного с организацией бесконечных циклов контекста. Цитата(sergeeff @ Dec 26 2008, 23:02)  А что такое TRUE? Общепринятое, максимально читабельное и соответствующее сущности значение.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 26 2008, 23:51
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(rezident @ Dec 27 2008, 02:34)  А не пора ли уже прекратить "религиозные" споры? Если результат компиляции одинаков Результат разный - в случае for( 1 ) приличными компиляторами выдается предупреждение, на которое можно, конечно, наплевать, что сделает компилятор при отключенной оптимизации - тоже на его совести. Можете считать это "религиозным" убеждением, наплевательское отношение к делу, равно, как и безграмотная писанина, мне не по душе. Впрочем в данном случае я смог высказаться полностью, более мне добавить нечего, а далее могущий понять да поймет - продолжать не буду.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 27 2008, 22:18
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

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