Преобразование BIN -->BCD

В том и фишка! С-компилятор оптимизирует лучше, чем руками в ассемблере. Причём, он умеете оптимизировать по контексту. Может - схлопнет, не может - так оставит. А ассемблеру пофиг - там как написал, так и останется.

Вполне возможно.

У меня тоже схлопывается, только у меня совсем просто в лоб написано, вот прямо в лоб, без массива констант. Тупо записано определение Фибоначчи.

Можете посмотреть и попробовать
//
// Здесь функция Fib, считающая числа Фибоначчи
//    Fib(0) = 0
//    Fib(1) = 1
//    Fib(n) = Fib(n-1) + Fib(n-2) (при 1 < n < 25)
//    Fib(n) = 0xFFFF (при n > 24)
//
constexpr inline uint16_t Fib(const uint8_t n) {
   return n > 24 ? 0xFFFF : n == 0 ? 0 : n == 1 ? 1 : Fib(n-1) + Fib(n-2);
}

void setup(void) {
	Serial.begin(9600);
   const uint32_t start = micros();
   const uint16_t result = Fib(24);
   const uint32_t duration = micros() - start;
   Serial.print("F(24)=");
   Serial.println(result);
   Serial.print("Время: ");
   Serial.print(duration);
   Serial.println(" us");
}

void loop(void) {}

Зачем? Условие задачи такое, какое есть. Только некоторые тут уже всю контору спалили :slight_smile:

Без разницы. Функция неудачная, потому как все ее значения, коих всего 26 штук можно впихнуть в константный массив. И тогда уже ассемблер почти ничего не даст по сравнению с Си. По крайней мере разница в скорости будет незначительной.

Евгений Петрович, странно…
И у Вас и у меня рекурсия, но у вас время 0, а у меня огого. Это почему так?
Очень долго IF работает, по сравнению с ( ? : ) ???

Очень удачная функция есть вот здесь. Но там постановка задачи сложновата для такого пари.

Там тоже все вычисления делает компилятор в код идут одни готовые константы. И тот функционал написать так, чтобы совсем не ел память на ассемблере (на тех, которые я знаю для авр) вообще невозможно, тамошние макросы такого не поддерживают.

Нужно смотреть на возвращаемый тип :wink:

У меня constexpr, потому компилятор всё вычислил сам, а в код впихнул уже готовую числовую константу. В коде вообще нет никакого вычисления от слова совсем.

О как!
Спасибо за разъяснения ! ))

c constexpr размеры и скорость как у меня
без constexpr размеры с скорость как у @BOOM
один в один

Да, если в ассемблере всё впихнуть в константный массив, то разница в скорости будет незначительной в пользу С++. А вот в памяти - на этот самый массив и на код по его обработке. В С++ - то в коде вообще ничего не остаётся - совсем ничего.

Таки да :slight_smile:

не за что. Вы ещё вот тут посмотрите. Там задача очень жизненная, постоянно приходится делать. Я только так её и делаю (типа библиотека имеется). В коде ни одного байта и ни одной команды - всё компилятор считает сам.

Но это уже читерство. )))
Данная штука показывает не преимущество какого-то языка программирования, а преимущество самого компилятора.

1 лайк

Ход Деавани. Его очередь задачу придумывать))

дак скажи хто, я их удалю.

А этого что, мало?
Мы разве говорим не о преимуществах компилятора с ЯВУ по сравнением с Ассемблером?

2 лайка

Речь шла о преимуществах подходов - писать на ассемблере или писать на С++ для конкретной Ардуины. Подход “писать на С++” даёт преимущества, которых не даёт подход “писать на языке ассемблера”. Не вижу никакого читерства.

Во-первых, с точки зрения подхода “на чём писать”, это неважно.

Ну, а во-вторых, простите, но constexpr и всё, что с ним связано - это конструкция именно языка программирования и её обязан поддерживать любой компилятор, соответствующий стандарту языка.

2 лайка

В любом случае, я “затебее всех за тебя” :)))

https://youtu.be/dFyf4qmiu5I?si=zEvTaBbuNj6ckjXb

2 лайка

у AVR нет XLAT, то бы я придумал )))