« 今日の日記 | Main | 本を引き取ってくれる人募集中 »

2007.08.08

今日もダメでした

あろはさんの所にコメント書いた。末尾再帰ができる条件にstaticだとか副作用は本質的じゃないですよ、って言いたかった。関数の中でprintf()とか使っても関係ないですよって。shiroさんの何でも継続もわかりやすい。とか思っていたら、始業の時間がせまりあわててpostしたら副作用の副の字も無くて自分でもわけわかめ。あろはさんには全部分かっている話でコメントつけにくかっただろうと思う。あろはさん、わけわからないこと書いてごめんなさい。

それはそれで置いておいて、コメントにも書いてありますがインラインの話。
void d() { printf("d"); return ; }
void c() { printf("c"); d(); return ;}
void b() { printf("b"); return ;}
void a() { printf("a"); b(); c(); return ;}
int main(void)
{
a();
return 0;
}

コメント書く前にcygwinで普通に-O3でコンパイルしたら、全部インライン展開されてjmpどころかcallすらしやがらないの。もうねgccに対して「横着するな!ちゃんと関数へ飛べ」って思った。なんか、若い人に「もうちょっと考えて仕事しろよ」って言ったら、思ったのと全然違うやり方で処理されて、しかも想像以上のパフォーマンスが出てきて、理解できないから「そんなやり方では駄目だ!」って根性論でけちつけてるみたいな。ごめんねgcc。着々と進むダメな大人化。

|

« 今日の日記 | Main | 本を引き取ってくれる人募集中 »

Comments

static 云々とか,sjlj (setjmp/longjmp) の話を全部含んで,副作用がどうこうという言い方は曖昧すぎましたね (^-^;

GCC のソース内で

144: FOR_EACH_REFERENCED_VAR (var, rvi)
145: {
146:
147: if (!(TREE_STATIC (var) || DECL_EXTERNAL (var))
148: && (var_ann (var)->mem_tag_kind == NOT_A_TAG
149: || var_ann (var)->mem_tag_kind == STRUCT_FIELD)
150: && is_call_clobbered (var))
151: return false;
152: }

174: if (USING_SJLJ_EXCEPTIONS && current_function_has_exception_handlers ())
175: return false;

みたいな感じで,関数のブロックが static とか extern な変数を含んでいたりすると,GCC は最適化を諦めるらしい,みたいな意味だったのですが,僕も説明がテキトーですいませんでした.

Posted by: あろは | 2007.08.09 at 12:25 AM

あろはさん、こんにちは。

話は変わりますが、http://natu.txt-nifty.com/natsutan/2007/08/post_9a53.html の中で欲しい本とかありますか?
良かったらお譲りしますがどうでしょう。

あろはさん以外の方(研究室の方とか)でも、引き取ってもらえると助かります。

Posted by: なつたん | 2007.08.09 at 08:19 AM

デバッガの理論と実装はぜひ欲しいですね〜 とか (笑)

Posted by: あろは | 2007.08.09 at 12:00 PM

あろはさん、すいません。

デバッガの理論と実装は2冊持っているはずですが、もう一冊がみつかりません。(残念)
実家に送った可能性も高いので、こんど帰ったときにさがしてみますね。

Posted by: なつたん | 2007.08.10 at 04:55 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/16049677

Listed below are links to weblogs that reference 今日もダメでした:

« 今日の日記 | Main | 本を引き取ってくれる人募集中 »