Итак, я играл с мысленными экспериментами, где представлял, что произойдет, когда две функции станут взаимно рекурсивными.Одним из таких примеров было то, что если обе функции потенциально могли бы попасть в бесконечный цикл.
Для этого я подумал о следующем простом примере:
#include <iostream>
#include <cstdlib>
int foo(int x);
int bar(int x);
int foo(int x)
{
return bar(x + 1);
}
int bar(int x)
{
return foo(x - 1);
}
int main(int argc, char **argv)
{
if (argc > 1)
std::cout << "The value is: " << foo(atoi(argv[1])) << std::endl;
return 0;
}
Интересно, что это на самом деле выведет на печатьабсолютно ничего, если вы скомпилируете это с g ++.Скомпилируйте его с любым ключом -O, и он попадет в бесконечный цикл.
Мысли?Возможно, это ошибка компилятора, или это следует ожидать?Я бы подумал, что в случае оптимизации -O он понял бы, что foo (x) и bar (x) возвращают только x.
Я не ожидал, что он действительно "оптимизирует" вызов иполностью игнорируйте вывод «Значение» на стандартный ввод.
Редактировать: я скомпилировал это как просто g ++ source.cpp (-O1 / 2/3), в Cygwin, используя GCC 4.5.0.Версии -OX фактически зацикливаются без переполнения стека.