哪些D编译器将对此函数执行尾部调用优化?

哪些D编译器将对此函数执行尾部调用优化?,d,dmd,gdc,D,Dmd,Gdc,据我所知,这段代码应该进行尾部调用优化,但我不知道DMD是否在这样做。哪些D编译器支持尾部调用优化,它们会在这个函数上执行它?从反汇编的角度看,DMD对代码执行TCO: string reverse(string str) pure nothrow { string reverse_impl(string temp, string str) pure nothrow { if (str.length == 0) { retu

据我所知,这段代码应该进行尾部调用优化,但我不知道DMD是否在这样做。哪些D编译器支持尾部调用优化,它们会在这个函数上执行它?

从反汇编的角度看,DMD对代码执行TCO:

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);
}

快速查看gdc生成的代码的一个非常好的资源是。我们目前没有一个dmd等价物。

在这种情况下,所有3个“主”D编译器都会执行优化吗?不幸的是,TCO没有出现在语言规范中,这无法保证。但对于你的例子来说,概率是相当高的。GDC在某些情况下确实会进行尾部调用优化,但在这种特殊情况下,我使用的GDC版本仍然会生成直接的递归调用。我使用了GDC 5.2.0。LDC 1.1.0在这个例子中做了正确的事情。
_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