2013-03-16 9 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 выполняет ТСО на код:

_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

Очень хороший ресурс для быстрого глядя на код, генерируемый GDC является http://d.godbolt.org/. В настоящее время у нас нет эквивалента dmd.

 Смежные вопросы

  • Нет связанных вопросов^_^