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, скомпилировать ее и посмотреть на сгенерированную сборку.

Другие вопросы по тегам