Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++で末尾再帰を最適化したい / Cpp-tail-recursion-elimination

C++で末尾再帰を最適化したい / Cpp-tail-recursion-elimination

07/13 RICORA Programming TeamのLTで用いた発表スライド

Shinonome517

July 13, 2022
Tweet

More Decks by Shinonome517

Other Decks in Programming

Transcript

  1. 再帰呼び出し int fib(int n){ if(n == 0){ return 0; }

    else{ return fib(n-1) + fib(n-2); } } 2022/06/03 © 2022 @Shinonome517Stu 8
  2. 末尾関数呼び出し int sigma(int n, int ans){ if(n <= 0){ return

    ans; } else{ return sigma(n - 1, ans + n); } } 2022/06/03 © 2022 @Shinonome517Stu 10
  3. ソースコード #include <iostream> #include <cstdint> using namespace std; int64_t sigma(int64_t

    n, int64_t ans){ if(n <= 0) return ans; else return sigma(n - 1, ans + n); } int main(){ cout << "sigma(100): " << sigma(100, 0) << endl; cout << "sigma(10000000): " << (int64_t)sigma(10000000, 0) << endl; } 2022/06/03 © 2022 @Shinonome517Stu 13
  4. 最適化オプションなし g++ -g -Wall sigma-rec.cpp -o no-opt.out O1 最適化オプション g++

    -g -Wall -O1 sigma-rec.cpp -o opt.out O2 最適化オプション g++ -g -Wall -O2 sigma-rec.cpp -o opt2.out 2022/06/03 © 2022 @Shinonome517Stu 15
  5. gdb 解析結果 ターミナルで gdb ./"file name" (gdb) disass sigma でsigma

    関数を逆アセンブルした 2022/06/03 © 2022 @Shinonome517Stu 18