コメント: Re:規格上どうなるべきか (スコア 1) 5
そういえば、gccの出力、ret命令がないな。戻らないということをきっちり判ってるのかな?
そういえば、gccの出力、ret命令がないな。戻らないということをきっちり判ってるのかな?
それと、アセンブリ出力も見てみたいなぁ、とリクエスト。
ほい。clang-3.0で -O2 を付けた場合。アーキテクチャはamd64ね。
func: # @func
.Ltmp0:
.cfi_startproc
# BB#0:
ret
.Ltmp1:
.size func, .Ltmp1-func
.Ltmp2:
.cfi_endproc
.Leh_func_end0:
要するに、関数に入って即座にret。
実際の所は、main()の中で、func()がインライン展開されちゃってfunc()が呼ばれることはありませんが。
再帰呼び出しの最適化がどうかかるか調べていたらおかしなアセンブリコードが見えたのでおや? と思ったのが発端。
おまけ: gcc-4.5.3で -O2 を付けた場合:
func:
.LFB22:
.cfi_startproc
.p2align 4,,10
.p2align 3
.L2:
jmp .L2
.cfi_endproc
単なる無限ループに。clangでもこうなることを期待してたんだけどなぁ。
先日の日記にて、D言語で不動点コンビネータを書いてみたら分かりにくくなったと述べたが、実はこれだけで実現できることに気付いた。
R delegate(TS) fix(R, TS...)(R delegate(R delegate(TS), TS) f)
{
return delegate(TS xs){ return f(fix(f), xs); };
}
ラムダ式をサポートしている版ならこう。
R delegate(TS) fix(R, TS...)(R delegate(R delegate(TS), TS) f)
{
return (TS xs) => f(fix(f), xs);
}
小説のタイトルというか、まんま本音というか……
# それはそれとして、コンビナート?
指摘ありがとうございます。修正しました。
clang-3.0にて。
// hoge.c
#include <stdio.h>
void func(void)
{
func();
}
int main(void)
{
func();
puts("The code clang generates is so fast.");
return 0;
}
ビルド & 実行。
[2012-02-06 23:20 誤字訂正]
暇潰しネタ。
関数型言語の世界では、計算機論の基礎のひとつ、不動点コンビネータの実装が頭の体操のための題材になることが多い。
一方、手続型言語ではどうかというと、この関数の実装を行うには、関数を動的に生成して返さなければならないため、古い言語では実装することができなかった。(アーキテクチャ固有のハックをすれば別だけど)
しかし、ラムダ式だのデリゲートだのが使える最近の言語なら手続型でも実装できるはず。
手続型言語で不動点コンビネータを実装すれば、慣れている分、分かりやすかったりしないかな? と思い、D言語で書いてみた。多引数対応。
先日の日記で、C11を使って擬似的な関数オーバーロードを実現しようとしたが、0引数の場合にうまくいかないということを書いた。
その後GCCの拡張機能を使うと実現できることに気付いたのでここに書く。
なお、C11のみで実現する方法はまだ思い付いていない。
さて、ここで使用した拡張機能は何かというと、可変長引数マクロで、コンマの後に空の__VA_ARGS__を続けた時に__VA_ARGS__の直前のコンマを削除できるという機能。
#define MACRO(...) ほげほげ , ## __VA_ARGS__
部下があっぷあっぷなので、コードばりばり書いちゃって
部下共々あっぷあっぷ。作業割り当ての調整だとか客先や営業との折衝だとかができなくなって、相談を持ってきた他の部下が頭を抱えるなんて例なら心当りが。
大物のコンパイル(make world)などは待てばいいわけだし。
cpufreqdを使えば、負荷に応じてクロックを上げるとか、makeが動いている間だけフルパワーで動かすとかいったことができますよ。
[2012-01-18 13:15追記: GCC拡張機能(clangでも使える)を利用して実現することができました。続・C11で疑似関数オーバーロード (GCC拡張機能使用)を参照して下さい。]
[C/C++規格: 11] C11の新機能 その2 -- 型ジェネリック式から話題を一部引っ越してきました。
C11で型ジェネリックが使えるようになったため、1引数の関数については擬似的に関数オーバーロードを実現するマクロを書けるようになった。
では引数の数が異なるものについてのオーバーロードはというと、_Genericのみで直接行うことはできない。でも、可変長引数マクロと組み合わせればできそうだと思ってコードを考えてみた。
ところが、どうにもうまくいかない。
なお、動作確認にはclang-3.0を使用した。
身近な人の偉大さは半減する -- あるアレゲ人