Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」

2,620 views

Published on

Published in: Technology
  • Login to see the comments

  • Be the first to like this

2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」

  1. 1. 札幌C++勉強会#2 C++のマクロはどこまで 関数をいじれるのか~「Pythonで末尾再帰最適化」問題から~ H.Hiro(Maraigue) Twitter: @h_hiro_
  2. 2. 自己紹介
  3. 3. H.Hiro(Maraigue)
  4. 4. H.Hiro(◕‿‿◕)
  5. 5. ←これがアイコンです
  6. 6. JR由仁駅の近くにあります
  7. 7. 大学院生(大学9年目)アルゴリズムの開発やってます普段はRubyの人ですでもC++もよく書きます他にはC#とかPythonとかC++は主に研究で利用Boostは全然使えてませんでも使い始めようと思ってます
  8. 8. 昨日はRuby勉強会で「ぽぽぽぽーん」言いすぎて すみませんでした http://www.slideshare.net/maraigue/201172-ruby-rubygems
  9. 9. 最近、C++を 書く機会が 増えていて
  10. 10. C++でももっと遊びたい お年頃
  11. 11. C++のマクロやテンプレートでもっと遊びたい お年頃
  12. 12. 今日はそんな話をしたいと 思います
  13. 13. お題
  14. 14. 末尾再帰最適化
  15. 15. って何?
  16. 16. 関数の再帰呼び出しが その関数の末尾だけに ある場合にはループに置き換えることで処理効率を良くできること
  17. 17. 言葉じゃ説明 しにくいので コードお見せしますPython: http://d.hatena.ne.jp/wasabiz/20110118/1295335821Ruby: http://d.hatena.ne.jp/athos/20110119/p1
  18. 18. これの面白いところは
  19. 19. 関数定義部が普通の再帰のコードなのにdef sum(n, acc=0): if n == 0: return acc else: return sum(n-1, acc+n)
  20. 20. 一言付け加えるだけで最適化されちゃったこと@tail_recursive # ←これ!注目!def sum(n, acc=0): if n == 0: return acc else: return sum(n-1, acc+n)
  21. 21. 実用性はないかもしれないけど ロマンが ありますよね!
  22. 22. じゃあこれを C++で行うにはどうすればよいか?
  23. 23. 札幌C++勉強会#2 C++のマクロはどこまで 関数をいじれるのか~「Pythonで末尾再帰最適化」問題から~ H.Hiro(Maraigue) Twitter: @h_hiro_
  24. 24. ※「コンパイラが最適化してくれるよ」ってツッコミは ご遠慮頂けると幸いです
  25. 25. 理想的には
  26. 26. 元の関数がこんな感じならlong long sum(long long count,long long acc = 0){ if(count == 0) return acc; return sum(count–1, acc+count);}
  27. 27. ↓これくらい楽に書ければいいよねTCO(long long sum)(long long count,long long acc = 0){ if(count == 0) return acc; return sum(count–1, acc+count);}
  28. 28. でもたぶん無理!
  29. 29. じゃあ、どこまで できるか やってみよう
  30. 30. その前に:C++のマクロの基本
  31. 31. #define TRUE 1…update(TRUE);
  32. 32. #define TRUE 1…update(TRUE);// ↑コンパイル前に// update(1)に置き換えられる
  33. 33. #define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);
  34. 34. #define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に// 置き換えられる
  35. 35. #define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に ←あれ?// 置き換えられる
  36. 36. #define HOGE(a, b) ((a)*(b))…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE((1+2)*(3+4))に// 置き換えられる
  37. 37. では実際に以下の関数をいじろうlong long sum(long long count,long long acc = 0){ if(count == 0) return acc; return sum(count–1, acc+count);}
  38. 38. (ここからライブコーディング)
  39. 39. ここまでできた!
  40. 40. まだうまく 出来ないか?● 引数の数によらない表記● 「long long, sum」を 「long long sum」と書けないか?
  41. 41. Boostだと 黒魔術的なマクロとかテンプレート とか多いので
  42. 42. 何とか出来るかも…
  43. 43. しかし、私は そこまでの知識を持ち合わせてない><
  44. 44. 協力求む!
  45. 45. (ここからライブコーディング)
  46. 46. To BeContinued (たぶん)
  47. 47. ソースコードはこちらhttp://gist.github.com/1062342

×