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

 
 
> Разворачивание на C++
ReAl
сообщение Nov 27 2010, 22:01
Сообщение #1


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

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



Да вот кстати о С++
Там тема интересная на avrfreaks, мужик хочет добиться нужного разворачивания для скорости вывода. Две страницы многоэтажного ма...кросизма.
Сейчас вот в голову стукнуло «чисто для поржать»
http://www.avrfreaks.net/index.php?name=PN...p=769453#769453
Причём полный улёт — шаблоны, ссылки... Страшный-страшный С++
И результат...


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dxp
сообщение Nov 29 2010, 05:20
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ReAl @ Nov 28 2010, 04:01) *
Да вот кстати о С++
[...]
Причём полный улёт — шаблоны, ссылки... Страшный-страшный С++
И результат...

Посмотрел по ссылке. Красиво. И реализация, и результат. a14.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Petka
сообщение Nov 29 2010, 07:47
Сообщение #3


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

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(dxp @ Nov 29 2010, 08:20) *
Посмотрел по ссылке. Красиво. И реализация, и результат. a14.gif


bb-offtopic.gif

Можно проще и на чистом си:
Код
inline void unroll_out(uint8_t count, uint8_t value)
{
    PORTB = value;
    value <<= 1;
    if(count) unroll_out(count-1, value);
}

void foo(uint8_t v)
{
    unroll_out(8, v);
}


Результат:
Код
00000014 <foo>:
  14:    88 bb           out    0x18, r24; 24
  16:    88 0f           add    r24, r24
  18:    88 bb           out    0x18, r24; 24
  1a:    88 0f           add    r24, r24
  1c:    88 bb           out    0x18, r24; 24
  1e:    88 0f           add    r24, r24
  20:    88 bb           out    0x18, r24; 24
  22:    88 0f           add    r24, r24
  24:    88 bb           out    0x18, r24; 24
  26:    88 0f           add    r24, r24
  28:    88 bb           out    0x18, r24; 24
  2a:    88 0f           add    r24, r24
  2c:    88 bb           out    0x18, r24; 24
  2e:    88 0f           add    r24, r24
  30:    88 bb           out    0x18, r24; 24
  32:    88 0f           add    r24, r24
  34:    88 bb           out    0x18, r24; 24
  36:    08 95           ret
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 30 2010, 06:11
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(Petka @ Nov 29 2010, 13:47) *
Можно проще и на чистом си:
Код
inline void unroll_out(uint8_t count, uint8_t value)
{
    PORTB = value;
    value <<= 1;
    if(count) unroll_out(count-1, value);
}

void foo(uint8_t v)
{
    unroll_out(8, v);
}

Есть принципиальная разница: шаблонный вариант всегда разворачивается на этапе компиляции, а сишный содержит рантаймное условие. И тут уже от компилятора зависит, развернет или нет.

Цитата(Petka @ Nov 29 2010, 16:34) *
А вот это, кстати, хорошо. Пишешь просто код, который тебе нужен, а если нужна мега оптимизация по скорости просто включаешь её в компиляторе.

Вот ничего хорошего тут нет - поведение непредсказуемое, зависящее от ключей компилятора, от сборки, от версии и ещё бог знает от чего.

Цитата(Petka @ Nov 29 2010, 16:34) *
ИМХО код на шаблонах в этом смысле менее гибок получился.

Код на шаблонах получается предсказуемым с гарантированным поведением. Если мне нужен именно unroll, то я его и применяю. И ожидаю, что это будет именно разворачивание. Если мне не нужно разворачивать, то не применяю это. Согласитесь, что вызывать функцию unroll, которая не делает unroll, как-то странно.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post



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

 


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


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