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

Post on 18-Dec-2014

1.686 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

札幌C++勉強会#2

C++のマクロはどこまで関数をいじれるのか

~「Pythonで末尾再帰最適化」問題から~

H.Hiro(Maraigue)Twitter: @h_hiro_

自己紹介

H.Hiro(Maraigue)

H.Hiro( ‿‿ )◕ ◕

←これがアイコンです

JR由仁駅の近くにあります

大学院生(大学9年目)アルゴリズムの開発やってます普段はRubyの人ですでもC++もよく書きます他にはC#とかPythonとかC++は主に研究で利用Boostは全然使えてませんでも使い始めようと思ってます

昨日はRuby勉強会で「ぽぽぽぽーん」言いすぎて

すみませんでしたhttp://www.slideshare.net/

maraigue/201172-ruby-rubygems

最近、C++を書く機会が増えていて

C++でももっと遊びたい

お年頃

C++のマクロやテンプレートでもっと遊びたい

お年頃

今日はそんな話をしたいと

思います

お題

末尾再帰最適化

って何?

関数の再帰呼び出しがその関数の末尾だけに

ある場合にはループに置き換えることで処理効率を良くできること

言葉じゃ説明しにくいので

コードお見せしますPython: http://d.hatena.ne.jp/wasabiz/20110118/1295335821

Ruby: http://d.hatena.ne.jp/athos/20110119/p1

これの面白いところは

関数定義部が普通の再帰のコードなのにdef sum(n, acc=0):

if n == 0:

return acc

else:

return sum(n-1, acc+n)

一言付け加えるだけで最適化されちゃったこと@tail_recursive # ←これ!注目!

def sum(n, acc=0):

if n == 0:

return acc

else:

return sum(n-1, acc+n)

実用性はないかもしれないけど

ロマンがありますよね!

じゃあこれをC++で行うには

どうすればよいか?

札幌C++勉強会#2

C++のマクロはどこまで関数をいじれるのか

~「Pythonで末尾再帰最適化」問題から~

H.Hiro(Maraigue)Twitter: @h_hiro_

※「コンパイラが最適化してくれるよ」ってツッコミはご遠慮頂けると幸いです

理想的には

元の関数がこんな感じならlong long sum

(long long count,

long long acc = 0){

if(count == 0) return acc;

return sum(count–1,

acc+count);

}

↓これくらい楽に書ければいいよねTCO(long long sum)

(long long count,

long long acc = 0){

if(count == 0) return acc;

return sum(count–1,

acc+count);

}

でもたぶん無理!

じゃあ、どこまでできるか

やってみよう

その前に:C++のマクロの基本

#define TRUE 1…update(TRUE);

#define TRUE 1…update(TRUE);// ↑コンパイル前に// update(1)に置き換えられる

#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);

#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に// 置き換えられる

#define HOGE(a, b) (a*b)…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE(1+2*3+4)に ←あれ?// 置き換えられる

#define HOGE(a, b) ((a)*(b))…HOGE(1+2, 3+4);// ↑コンパイル前に// HOGE((1+2)*(3+4))に// 置き換えられる

では実際に以下の関数をいじろう

long long sum

(long long count,

long long acc = 0){

if(count == 0) return acc;

return sum(count–1,

acc+count);

}

(ここからライブコーディング)

ここまでできた!

まだうまく出来ないか?

●引数の数によらない表記●「long long, sum」を 「long long sum」と書けないか?

Boostだと黒魔術的な

マクロとかテンプレートとか多いので

何とか出来るかも…

しかし、私はそこまでの知識を

持ち合わせてない><

協力求む!

(ここからライブコーディング)

To BeContinued

(たぶん)

ソースコードはこちらhttp://gist.github.com/1062342

top related