2013-03-16 8 views
5
string reverse(string str) pure nothrow 
{ 
    string reverse_impl(string temp, string str) pure nothrow 
    { 
     if (str.length == 0) 
     { 
      return temp; 
     } 
     else 
     { 
      return reverse_impl(str[0] ~ temp, str[1..$]); 
     } 
    } 

    return reverse_impl("", str); 
} 

私の知る限り、このコードにテールコール最適化の対象にする必要がありますが、DMDが行うかどうかはわかりません。どのDコンパイラがテールコール最適化をサポートしていますか?この関数でテールコール最適化を実行するDコンパイラはどれですか?

+0

GDCは特定の状況でテールコールの最適化を行うのは確かですが、この特定のケースでは私が使用していたGDCのバージョンでもまっすぐな再帰呼び出しが生成されます。 –

+0

GDC 5.2.0を使用しました。 –

+0

LDC 1.1.0はこの例で正しいことをしました。 –

答えて

8

解体を見てから、DMDは、あなたのコードでTCOを実行します。すぐにGDCによって生成されたコードを見るため

_D4test7reverseFNaNbAyaZAya12reverse_implMFNaNbAyaAyaZAya comdat 
    assume CS:_D4test7reverseFNaNbAyaZAya12reverse_implMFNaNbAyaAyaZAya 
L0:  sub ESP,0Ch 
     push EBX 
     push ESI 
     cmp dword ptr 018h[ESP],0 
     jne L1C 

LC:  mov EDX,024h[ESP] 
     mov EAX,020h[ESP] 
     pop ESI 
     pop EBX 
     add ESP,0Ch 
     ret 010h 

L1C: push dword ptr 024h[ESP] 
     mov EAX,1 
     mov EDX,offset FLAT:_D12TypeInfo_Aya6__initZ 
     push dword ptr 024h[ESP] 
     mov ECX,024h[ESP] 
     push ECX 
     push EAX 
     push EDX 
     call near ptr __d_arraycatT 
     mov EBX,02Ch[ESP] 
     mov ESI,030h[ESP] 
     mov 034h[ESP],EAX 
     dec EBX 
     lea ECX,1[ESI] 
     mov 01Ch[ESP],EBX 
     mov 020h[ESP],ECX 
     mov 02Ch[ESP],EBX 
     mov 030h[ESP],ECX 
     mov 038h[ESP],EDX 
     add ESP,014h 
     cmp dword ptr 8[ESP],0 
     jne L1C 
     jmp short LC 
_D4test7reverseFNaNbAyaZAya12reverse_implMFNaNbAyaAyaZAya ends 
    end 
+0

この場合、3つの「メイン」Dコンパイラが最適化を実行しますか? – Meta

+1

残念ながら、TCOは言語仕様では存在せず、これは保証されません。しかし、あなたの例では確率はかなり高いです。 –

4

非常に良いリソースがhttp://d.godbolt.org/です。現在のところ、dmdに相当するものはありません。

関連する問題