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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> WinAVR 2006, Компилятор полностью игнорирует циклы
ReAl
сообщение Jan 11 2008, 11:41
Сообщение #16


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(zltigo @ Jan 11 2008, 12:47) *
Если вдруг есть какие-то дополнительные официальные (а не очевидные трактовки fast и least) рекомендации было-бы интересно посмотреть.
Ничего кроме пары абзацев в стандарте не видел. От них устойчивое впечатление как "оптимизация преимущественно на размер" и "оптимизация преимущественно на скорость" для платформ начиная от 8-битных и больше ничего.
Это типы, а register - это storage class - вещи ортогонгальные. Может быть register int_least8_t и может быть int_fast8_t без него.


Цитата(zltigo @ Jan 11 2008, 12:47) *
Проблема не в усмотрении, а в том, что это "усмотрение" не всегда нравится - на том-же ARM нет "вполне приличной работы с байтами". Нет sad.gif, посему когда вдруг он вдруг компилятор иногда начинает дополнительно извращаться с какой-нибудь 24bit маской sad.gif мне это совершенно не нравится.
Ну так если интересовала по мере возможности скорость работы, а не по мере возможности компактность размещения в памяти - то почему был взят int_least8_t а не int_fast8_t ???
Я надеюсь, что fast8 таки на ARM будет 32 бита, ну а на AVR будет 8, так как их хватает.

Цитата
7.18.1.2 Minimum-width integer types
1 The typedef name int_leastN_t designates a signed integer type with a width of at least N, such that no signed integer type with lesser size has at least the specified width. Thus, int_least32_t denotes a signed integer type with a width of at least 32 bits.
2 The typedef name uint_leastN_t designates an unsigned integer type with a width of at least N, such that no unsigned integer type with lesser size has at least the specified width. Thus, uint_least16_t denotes an unsigned integer type with a width of at least 16 bits.
3 The following types are required:
int_least8_t
int_least16_t
int_least32_t
int_least64_t
uint_least8_t
uint_least16_t
uint_least32_t
uint_least64_t
All other types of this form are optional.

7.18.1.3 Fastest minimum-width integer types
1 Each of the following types designates an integer type that is usually fastest216) to operate with among all integer types that have at least the specified width.
2 The typedef name int_fastN_t designates the fastest signed integer type with a width of at least N. The typedef name uint_fastN_t designates the fastest unsigned integer type with a width of at least N.
216) The designated type is not guaranteed to be fastest for all purposes; if the implementation has no clear grounds for choosing one type over another, it will simply pick some integer type satisfying the signedness and width requirements.
3 The following types are required:
int_fast8_t
int_fast16_t
int_fast32_t
int_fast64_t
uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t
All other types of this form are optional


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 11 2008, 11:46
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Повторю еще раз свой вопрос - в "типичных" случаях (циклы и т.д.) что стоит применять - _fast или _least? Судя по постам Zltigo насчет масок - всеж таки fast...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 11 2008, 11:58
Сообщение #18


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Непомнящий Евгений @ Jan 11 2008, 13:46) *
Повторю еще раз свой вопрос - в "типичных" случаях (циклы и т.д.) что стоит применять - _fast или _least? Судя по постам Zltigo насчет масок - всеж таки fast...
На мой взгляд - для одиночных переменных или полей одиночных структур безусловно fast, причём судя скорее по стандарту (одна архитектура + один компилятор - не статистика). А вот если массив, то думать о размерах/скоростях и скорее least.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 11 2008, 12:03
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(ReAl @ Jan 11 2008, 14:58) *

В принципе и сам так думал. Спасибо за разъяснения.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 11 2008, 12:09
Сообщение #20


Гуру
******

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



Цитата(ReAl @ Jan 11 2008, 13:41) *
Ничего кроме пары абзацев в стандарте не видел...

Аналогично.
Цитата
.. "оптимизация преимущественно на размер" и "оптимизация преимущественно на скорость" для платформ начиная от 8-битных...

Причем иногда вылезает проигрыш и по размеру и проигрыш по скорости одновременно sad.gif sad.gif sad.gif
Цитата
Это типы, а register - это storage class - вещи ортогонгальные.

Ну типа да...
Цитата
Я надеюсь, что fast8 таки на ARM будет 32 бита, ну а на AVR будет 8, так как их хватает.

В тех случаях, когда наблюдались эффекты это был least. Действительно замена в одном из вариантов на fast к нормальному результату (остальные не пробовались), поскольку экспериментировать далее не хотелось - решил явно ручками дополнительный тип родить.
Потом его уже можно спокойненько всместо int (для ARM), хоть в fast, хоть least... Да и читать писать короче smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 11 2008, 12:26
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Непомнящий Евгений @ Jan 11 2008, 14:46) *
Повторю еще раз свой вопрос - в "типичных" случаях (циклы и т.д.) что стоит применять - _fast или _least? Судя по постам Zltigo насчет масок - всеж таки fast...


Типы "_least" и _fast введены для улудшения переносимости кода.

_least - Существуют процессоры которые не поддерживают 8-битные данные, (некоторые DSP). Истоьзуем тип int_least8_t и один и тодже код будет компилироваться и на и процессоре который поддерживает 8-битные данные, и на том который нет, используя наименьший поддерживаемый тип для данного процесора.

_fast - Допустим есть 32-битный процессор для котораго работа с 8-битными данными менее эффективна чем с родными 32-битными. А ма хотим чтобы один и тодже код был максимально эффективным и для этого процессора и для например AVR. Истоьзуем тип int_fast8_t и для этого процессора переменная будет 32-битной, а для AVR 8-битной.

А думаю в "типичных" случаях не нужно использовать эти типы. Используйте их когда пишете код предназначеный для работы на разных платформах.

Анатолий.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 11 2008, 12:35
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



да кто ж его знает, где он будет работать smile.gif Если когда-нибудь возникнет необходимость переползти на АРМ не хотелось бы руками вычищать все byte и разбираться, где byte - это действительно unsigned char, а где просто заменитель unsigned int...
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 11 2008, 12:49
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Непомнящий Евгений @ Jan 11 2008, 15:35) *
да кто ж его знает, где он будет работать smile.gif Если когда-нибудь возникнет необходимость переползти на АРМ не хотелось бы руками вычищать все byte и разбираться, где byte - это действительно unsigned char, а где просто заменитель unsigned int...


Если для переменной важен размер - используйте int_XX_t. При этом не гарантируеться полная переносимость и эффективность кода.
Если важна эффективность скомпилированнога кода - используйте int_fastXX_t. При этом не гарантируеться размер переменной.
Если надо чтобы код работал на всех процесорах даже на тех которые могут не поддерживать все раззмерности данных используйте int_leastXX_t. При этом не гарантируеться размер переменной и эффективность кода.


Анатолий.

Сообщение отредактировал aesok - Jan 11 2008, 13:00
Go to the top of the page
 
+Quote Post

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

 


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


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