Arduino поддерживает устранение хвостовых вызовов?
Мне было интересно, если стандартная среда Arduino поддерживает устранение хвостовых вызовов... Кто-нибудь знает что-нибудь об этом?
2 ответа
Исключение хвостовых вызовов действительно поддерживается и включено по умолчанию в Arduino IDE. Это вполне стандартно для мира микроконтроллеров, где средства отладки, такие как надлежащие кадры стека, жертвуются ради эффективности памяти.
Вот тест:
const int RAM_SIZE_IN_BYTES = 2048;
void f(int i) {
Serial.println(i);
if(i == 0) return;
else f(i-1);
}
void setup() {
Serial.begin(9600);
f(RAM_SIZE_IN_BYTES);
}
void loop() {
}
Этот код выводит на консоль числа от 2048 до 0, что требует больше рекурсивных вызовов, чем доступных байтов ОЗУ.
Большинство компиляторов C не поддерживают исключение хвостовых вызовов. (это понятие не в стандарте C).
Некоторые недавние компиляторы C могут поддерживать его (только при сильной оптимизации), в очень ограниченных случаях. В частности, GCC (последняя версия вроде 4.6 или 4.7).
Вы можете попробовать простую функцию C, скомпилировать ее и посмотреть на сгенерированную сборку.