Насколько эффективен g ++ / gcc при развертывании рекурсивных встроенных функций? - PullRequest
3 голосов
/ 17 октября 2011

У меня есть рекурсивная, но не хвостовая рекурсивная встроенная функция, для которой я бы хотел, чтобы gcc развернул рекурсию. Да, я использую g++ -O3 -funroll-loops конечно.

inline void recurse_fun(..., unsigned depth = 0, unsigned max_depth = 40) {
    if (++depth > max_depth) return;
    for (auto i = ..., iend = ...; i != iend; i++) {
        if (...) continue;
        ...
        recurse_fun(...,depth,max_depth);
    }
}

Я мог бы легко заменить это, обработав объект stack<...> вручную, который gcc должен правильно развернуть, но он не был бы столь же элегантным или обслуживаемым.

Я действительно должен попытаться профилировать обе версии независимо, но мне любопытно, если кто-нибудь может с уверенностью сказать, что какая-то недавняя версия gcc будет или не будет правильно обрабатывать это.

1 Ответ

1 голос
/ 06 ноября 2011

GCC (по крайней мере, в последних версиях, таких как 4.5 или 4.6) разворачивает некоторые хвостовые рекурсивные вызовы.Конечно, вам нужно попросить его оптимизировать (поэтому -O2 или -O3 требуется).

Чтобы понять, что он делает, вы можете

  • Запросить вывод сборкис чем-то вроде gcc -O3 -fverbose-asm -S yoursource.c
  • Запросить различные файлы дампа , например gcc -c -fdump-tree-all -fdump-ipa-all -O3 yoursource.c (и есть другие файлы дампа)

Остерегайтесь того, что GCC напечатаетмного (сотни!) файлов дампа.А файлы дампа предназначены только для разработчиков GCC или разработчиков плагинов GCC (или GCC MELT developpers).Не ожидайте, что они останутся в одном и том же формате от одного выпуска GCC к следующему.

Нумерация файлов дампа бесполезна: она не хронологическая или логическая.

Ипараметры дампа могут измениться в следующем выпуске GCC ( 4.7 , возможно, в 2012 году)

...