реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> Странности при оптимизации
Сергей Борщ
сообщение Dec 25 2008, 23:15
Сообщение #31


Гуру
******

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



Цитата(zltigo @ Dec 26 2008, 00:50) *
Угу, и у тебя тоже smile.gif не все включено, ибо еще, если мне не изменяет склероз, должено быть что-то типа Е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)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 26 2008, 08:07
Сообщение #32


Гуру
******

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



Цитата(Сергей Борщ @ Dec 26 2008, 02:15) *
Абижяешь, начальник! Я их никогда не отключаю. Нет предупреждения ни в С ни в С++ режиме.

Я же не говорил про отключение я говорил про "не все включено" smile.gif. Ой, а что у меня это, если написать while(1) :
Код
   IAR ARM ANSI C/C++ Compiler .....
D:\ARM_WORK\COMMON\LPC2000\console.c(356) : Remark[Pe236]: controlling expression is constant

Просто в IAR по умолчанию ремарки отключены sad.gif надо включать, тем более, что под remark в IAR попадают и такие суровые приколы, как
Remark[Pe193]: zero used for undefined preprocessing identifier


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 26 2008, 08:53
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Сергей Борщ @ Dec 25 2008, 13:24) *
Не во всех компиляторах. В avr-gcc вызов линкера с опцией --relax приводит к замене пар call/ret на jmp, а jmp (там, где длина перехода позволяет) - на rjmp. Это вполне себе оптимизация и занимается ей именно линкер.
Thnx, не знал, добавлю в копилку beer.gif Но по сравнению с тем, что способен сделать компилятор - это всетаки 'не оптимизация' cool.gif Оптимизации такого уровня способен делать любой компонент в цепочке компиляции, например в Sun'овском ассемблере он мог делать inline подстановки специальных функций (они были описанны в специальных файлах) вместо их вызовов
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 26 2008, 12:42
Сообщение #34


Участник
*

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



Цитата(zltigo @ Dec 26 2008, 01:50) *
Вобще-то сие однозначно со всех точек зрения пишется так:
Код
for(;; )  { .... }

А есть разница? smile.gif
Код
while(1) { .... }

По-моему нет.
В справке к Hi-Tech C они предлагают для бесконечного цикла for(;;) { .... }
При каком-то кол-ве циклов внутри цикла for{ for { for { for {}}}}
компилятор вешается поэтому приходится комбинировать for... while... if... и т.д.
В IAR пока не смотрел. Вроде таких проблем не было.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 26 2008, 13:39
Сообщение #35


Гуру
******

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



Цитата(DenisIV @ Dec 26 2008, 15:42) *
А есть разница? smile.gif

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

Опять sad.gif ужасы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 26 2008, 14:29
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

" Странная запись for(;;) - это стандартный способ задать бесконечный цикл; можно произносить это как "навсегда". Это вырожденная форма оператора for; альтернатива - while(1)."
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 26 2008, 16:26
Сообщение #37


Участник
*

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



Цитата(zltigo @ Dec 26 2008, 16:39) *
Разумеется. Если for( ; ; ) есть прямое и безусловно однозначное указание компилятору изобразить вечный цикл, то while(1) есть указание крутиться и слушать пока рак на горе свистнет. Что не есть одно и то-же. Хотя сколь-нибудь приличный оптимизирующий компилятор знакомый с русским фольклером и анатомическим строением ракообразных smile.gif тоже сделает безусловный вечный цикл. Ну и, естественно, хороший компилятор при этом обязан предупредить - ты чего тут барин загадки загадываешь? Точно этого хотел, али опосля вчерашнего того.....
Опять sad.gif ужасы.

Ну я бы так не сказал: если в for(;;) нет условия, это может быть ошибкой, а for(;1;) тоже, что и while(1)
и раз уж так, то while() { .... } должно работать так же как и for(;;) ?
Т.е. в for не надо вставлять условие ??? а в while надо ??? Правильным будет всегда с условием. Это точно не противоречит стандарту С. А то, что как вы сказали "оптимизирующий компилятор знакомый с русским фольклором" - это скорее исключение, а не правило. Поэтому и обидно... sad.gif Если я буду всем советовать for(;;) то это не будет правильно. Что for(;;) что while() - Варнинги обеспечены по любому. А хотелось бы писать правильно. И запись for(;1;) будет правильней.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 26 2008, 16:41
Сообщение #38


Гуру
******

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



Цитата(DenisIV @ Dec 26 2008, 19:26) *
Что for(;;) что while() - Варнинги обеспечены по любому.

smile.gif нет. Для этого просто надо знать язык - по стандарту ВСЕ ТРИ expression у for() ОПЦИОНАЛЬНЫ. В отличии от while() у которого один, но ОБЯЗАТЕЛЬНЫЙ.
При этом оговаривается, что отсутствующее второе выражение у for() заменяется ненулевой константой.
Цитата
А хотелось бы писать правильно. И запись for(;1;) будет правильней.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 26 2008, 20:02
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

Как написано у Кернигана & Ритчи "Какой цикл выбрать: while или for - это дело вкуса". Нельзя считать, что миллионы программистов, исповедующие другой стиль написания программ, пишут глупости (не скромно это, как-то).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 26 2008, 23:10
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 26 2008, 23:34
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А не пора ли уже прекратить "религиозные" споры? Если результат компиляции одинаков, то стилистика пускай на совести программиста останется. Конечно нет пределов совершенству и самосовершенствованию, но и насильно в свою "религию" тоже обращать не стоит. Мнения прозвучали, теперь каждый может сделать выводы. Только уже "молча". Чтобы до размахивания авторитетами и до оскорблений дело не дошло.
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Dec 26 2008, 23:34
Сообщение #42


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(XVR @ Dec 26 2008, 10:53) *
...
Оптимизации такого уровня способен делать любой компонент в цепочке компиляции, например в Sun'овском ассемблере он мог делать inline подстановки специальных функций (они были описанны в специальных файлах) вместо их вызовов

Это называется макрос и есть в любом ассемблере, оптимизацией это называть сложно. Тогда уж всё, что позволяет программу писать не прямо в машинных кодах, есть оптимизация smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 26 2008, 23:51
Сообщение #43


Гуру
******

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



Цитата(rezident @ Dec 27 2008, 02:34) *
А не пора ли уже прекратить "религиозные" споры? Если результат компиляции одинаков

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 27 2008, 08:33
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(HARMHARM @ Dec 27 2008, 02:34) *
Это называется макрос и есть в любом ассемблере, оптимизацией это называть сложно. Тогда уж всё, что позволяет программу писать не прямо в машинных кодах, есть оптимизация smile.gif
Это не есть макрос - он заменяет не макровызов (по ID макроса), а обычную ассемблерную комманду call
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 27 2008, 22:18
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 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 в их компиляторы, не находите?
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 06:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016