В том и фишка! С-компилятор оптимизирует лучше, чем руками в ассемблере. Причём, он умеете оптимизировать по контексту. Может - схлопнет, не может - так оставит. А ассемблеру пофиг - там как написал, так и останется.
Вполне возможно.
У меня тоже схлопывается, только у меня совсем просто в лоб написано, вот прямо в лоб, без массива констант. Тупо записано определение Фибоначчи.
Можете посмотреть и попробовать
//
// Здесь функция 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) {}
Зачем? Условие задачи такое, какое есть. Только некоторые тут уже всю контору спалили
Без разницы. Функция неудачная, потому как все ее значения, коих всего 26 штук можно впихнуть в константный массив. И тогда уже ассемблер почти ничего не даст по сравнению с Си. По крайней мере разница в скорости будет незначительной.
Евгений Петрович, странно…
И у Вас и у меня рекурсия, но у вас время 0, а у меня огого. Это почему так?
Очень долго IF работает, по сравнению с ( ? : ) ???
Очень удачная функция есть вот здесь. Но там постановка задачи сложновата для такого пари.
Там тоже все вычисления делает компилятор в код идут одни готовые константы. И тот функционал написать так, чтобы совсем не ел память на ассемблере (на тех, которые я знаю для авр) вообще невозможно, тамошние макросы такого не поддерживают.
У меня constexpr, потому компилятор всё вычислил сам, а в код впихнул уже готовую числовую константу. В коде вообще нет никакого вычисления от слова совсем.
Да, если в ассемблере всё впихнуть в константный массив, то разница в скорости будет незначительной в пользу С++. А вот в памяти - на этот самый массив и на код по его обработке. В С++ - то в коде вообще ничего не остаётся - совсем ничего.
не за что. Вы ещё вот тут посмотрите. Там задача очень жизненная, постоянно приходится делать. Я только так её и делаю (типа библиотека имеется). В коде ни одного байта и ни одной команды - всё компилятор считает сам.
Речь шла о преимуществах подходов - писать на ассемблере или писать на С++ для конкретной Ардуины. Подход “писать на С++” даёт преимущества, которых не даёт подход “писать на языке ассемблера”. Не вижу никакого читерства.
Во-первых, с точки зрения подхода “на чём писать”, это неважно.
Ну, а во-вторых, простите, но constexpr и всё, что с ним связано - это конструкция именно языка программирования и её обязан поддерживать любой компилятор, соответствующий стандарту языка.