plop
Cの継続 |
CbCの継続(軽量継続) |
|
|
__code print_factorial(int prod) { printf("factorial = %d\n",prod); exit(0); } __code factorial0(int prod, int x) { if ( x >= 1) { goto factorial0(prodx, x-1); }else{ goto print_factorial(prod); } } __code factorial(int x) { goto factorial0(1, x); } int main(int argc, char *argv) { int i; i = atoi(argv[1]); goto factorial(i); } |
|
void f(int a, int b) { printf("f: a=%d b=%d\n",a,b); return ; } void g(int a, int b){ printf("g: a=%d b=%d\n",a,b); f(a,b); return; } int main() { g(3,4); return 0; } |
最適化 | 状態遷移 |
最適化無し | |
GCC-4.5 の最適化 |
|
GCC-4.6 の最適化 |
CbC-GCC-4.5 | CbC-GCC-4.6 |
main: call f : jmp f_g0 : movq $f_g1, -24(%rdx) addl $10, %edi movq $g_h1, -48(%rdx) jmp g_h1 : movq 24(%rsi), %rdx movq %rax, %rsi : jmp %rdx : movq 24(%rsi), %rdx : jmp %rdx |
main: movq $f_g1, main_stack+2000(%rip) : call g_h1 : movq 24(%rax), %rdx : jmp %rdx : movq 24(%rax), %rdx : jmp %rdx |
以下の使い方の場合、戻値 1 を返す。
code c1(code ret(int,void ),void env) { goto ret(1,env); } int main() { goto c1(return, environment); }
今回この環境付き継続をスレッドセーフの実装へと修正した。
fastcall無し |
fastcall有り |
Table of Contents | t |
---|---|
Exposé | ESC |
Full screen slides | e |
Presenter View | p |
Source Files | s |
Slide Numbers | n |
Toggle screen blanking | b |
Show/hide slide context | c |
Notes | 2 |
Help | h |